This is an automated email from the ASF dual-hosted git repository.
jlmonteiro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomee.git
The following commit(s) were added to refs/heads/master by this push:
new 276a9e6 Better fix for default Tomcat User identity store
276a9e6 is described below
commit 276a9e6aab8f1103ab39beaa8bfe5e2bf4b7cd68
Author: Jean-Louis Monteiro <[email protected]>
AuthorDate: Wed Jul 15 16:00:12 2020 +0200
Better fix for default Tomcat User identity store
---
.../tomee/security/cdi/TomEESecurityExtension.java | 29 +++++++++++++++++++-
.../cdi/TomcatUserIdentityStoreDefinition.java | 31 ++++++++++++++++++++++
.../identitystore/TomEEDefaultIdentityStore.java | 11 +++++++-
.../security/context/SecurityContextTest.java | 4 +++
.../security/servlet/BasicAuthServletTest.java | 2 ++
.../security/servlet/FormAuthServletTest.java | 3 +++
.../tomee/security/servlet/SimpleServletTest.java | 2 ++
7 files changed, 80 insertions(+), 2 deletions(-)
diff --git
a/tomee/tomee-security/src/main/java/org/apache/tomee/security/cdi/TomEESecurityExtension.java
b/tomee/tomee-security/src/main/java/org/apache/tomee/security/cdi/TomEESecurityExtension.java
index 82683c8..7a315be 100644
---
a/tomee/tomee-security/src/main/java/org/apache/tomee/security/cdi/TomEESecurityExtension.java
+++
b/tomee/tomee-security/src/main/java/org/apache/tomee/security/cdi/TomEESecurityExtension.java
@@ -57,6 +57,7 @@ public class TomEESecurityExtension implements Extension {
private final Set<AnnotatedType> formAuthentication = new HashSet<>();
private final Set<AnnotatedType> customAuthentication = new HashSet<>();
+ private final Set<AnnotatedType> tomcatUserIdentityStore = new HashSet<>();
private final Set<AnnotatedType> databaseIdentityStore = new HashSet<>();
private final Set<AnnotatedType> ldapIdentityStore = new HashSet<>();
@@ -82,12 +83,17 @@ public class TomEESecurityExtension implements Extension {
void processIdentityStores(
@Observes
@WithAnnotations({
+ TomcatUserIdentityStoreDefinition.class,
DatabaseIdentityStoreDefinition.class,
LdapIdentityStoreDefinition.class
}) final ProcessAnnotatedType<?>
processAnnotatedType) {
final AnnotatedType<?> annotatedType =
processAnnotatedType.getAnnotatedType();
+ if
(annotatedType.isAnnotationPresent(TomcatUserIdentityStoreDefinition.class)) {
+ tomcatUserIdentityStore.add(annotatedType);
+ }
+
if
(annotatedType.isAnnotationPresent(DatabaseIdentityStoreDefinition.class)) {
databaseIdentityStore.add(annotatedType);
}
@@ -125,7 +131,17 @@ public class TomEESecurityExtension implements Extension {
@Observes final AfterBeanDiscovery afterBeanDiscovery,
final BeanManager beanManager) {
- if (databaseIdentityStore.isEmpty() && ldapIdentityStore.isEmpty()) {
// add out identity store
+ if (!tomcatUserIdentityStore.isEmpty()) {
+ afterBeanDiscovery
+ .addBean()
+ .id(TomEEDefaultIdentityStore.class.getName() + "#" +
TomcatUserIdentityStoreDefinition.class.getName())
+ .beanClass(Supplier.class)
+ .addType(Object.class)
+ .addType(new
TypeLiteral<Supplier<TomcatUserIdentityStoreDefinition>>() {})
+ .qualifiers(Default.Literal.INSTANCE, Any.Literal.INSTANCE)
+ .scope(ApplicationScoped.class)
+ .createWith(creationalContext ->
createTomcatUserIdentityStoreDefinitionSupplier(beanManager));
+
afterBeanDiscovery
.addBean()
.id(TomEEDefaultIdentityStore.class.getName())
@@ -313,6 +329,17 @@ public class TomEESecurityExtension implements Extension {
};
}
+ private Supplier<TomcatUserIdentityStoreDefinition>
createTomcatUserIdentityStoreDefinitionSupplier(final BeanManager beanManager) {
+ return () -> {
+ final TomcatUserIdentityStoreDefinition annotation =
tomcatUserIdentityStore.iterator()
+
.next()
+
.getAnnotation(
+
TomcatUserIdentityStoreDefinition.class);
+
+ return
TomEEELInvocationHandler.of(TomcatUserIdentityStoreDefinition.class,
annotation, beanManager);
+ };
+ }
+
private Supplier<DatabaseIdentityStoreDefinition>
createDatabaseIdentityStoreDefinitionSupplier(final BeanManager beanManager) {
return () -> {
final DatabaseIdentityStoreDefinition annotation =
databaseIdentityStore.iterator()
diff --git
a/tomee/tomee-security/src/main/java/org/apache/tomee/security/cdi/TomcatUserIdentityStoreDefinition.java
b/tomee/tomee-security/src/main/java/org/apache/tomee/security/cdi/TomcatUserIdentityStoreDefinition.java
new file mode 100644
index 0000000..3d2644e
--- /dev/null
+++
b/tomee/tomee-security/src/main/java/org/apache/tomee/security/cdi/TomcatUserIdentityStoreDefinition.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomee.security.cdi;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+@Retention(RUNTIME)
+@Target(TYPE)
+public @interface TomcatUserIdentityStoreDefinition {
+
+ String resource() default "UserDatabase";
+
+}
\ No newline at end of file
diff --git
a/tomee/tomee-security/src/main/java/org/apache/tomee/security/identitystore/TomEEDefaultIdentityStore.java
b/tomee/tomee-security/src/main/java/org/apache/tomee/security/identitystore/TomEEDefaultIdentityStore.java
index 3ddb53a..2fd7c9f 100644
---
a/tomee/tomee-security/src/main/java/org/apache/tomee/security/identitystore/TomEEDefaultIdentityStore.java
+++
b/tomee/tomee-security/src/main/java/org/apache/tomee/security/identitystore/TomEEDefaultIdentityStore.java
@@ -22,9 +22,11 @@ import org.apache.catalina.core.StandardServer;
import org.apache.catalina.deploy.NamingResourcesImpl;
import org.apache.tomcat.util.descriptor.web.ContextResource;
import org.apache.tomee.loader.TomcatHelper;
+import org.apache.tomee.security.cdi.TomcatUserIdentityStoreDefinition;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
import javax.security.enterprise.credential.Credential;
import javax.security.enterprise.credential.UsernamePasswordCredential;
import javax.security.enterprise.identitystore.CredentialValidationResult;
@@ -32,19 +34,26 @@ import
javax.security.enterprise.identitystore.IdentityStore;
import javax.security.enterprise.identitystore.IdentityStorePermission;
import java.util.HashSet;
import java.util.Set;
+import java.util.function.Supplier;
import static java.util.Collections.emptySet;
@ApplicationScoped
public class TomEEDefaultIdentityStore implements IdentityStore {
+ @Inject
+ private Supplier<TomcatUserIdentityStoreDefinition> definitionSupplier;
+ private TomcatUserIdentityStoreDefinition definition;
+
private UserDatabase userDatabase;
@PostConstruct
private void init() throws Exception {
+ definition = definitionSupplier.get();
+
final StandardServer server = TomcatHelper.getServer();
final NamingResourcesImpl resources =
server.getGlobalNamingResources();
- final ContextResource userDataBaseResource =
resources.findResource("UserDatabase");
+ final ContextResource userDataBaseResource =
resources.findResource(definition.resource());
userDatabase = (UserDatabase)
server.getGlobalNamingContext().lookup(userDataBaseResource.getName());
}
diff --git
a/tomee/tomee-security/src/test/java/org/apache/tomee/security/context/SecurityContextTest.java
b/tomee/tomee-security/src/test/java/org/apache/tomee/security/context/SecurityContextTest.java
index 4e626bd..9c26db5 100644
---
a/tomee/tomee-security/src/test/java/org/apache/tomee/security/context/SecurityContextTest.java
+++
b/tomee/tomee-security/src/test/java/org/apache/tomee/security/context/SecurityContextTest.java
@@ -17,6 +17,7 @@
package org.apache.tomee.security.context;
import org.apache.tomee.security.AbstractTomEESecurityTest;
+import org.apache.tomee.security.cdi.TomcatUserIdentityStoreDefinition;
import org.junit.Test;
import javax.inject.Inject;
@@ -97,6 +98,7 @@ public class SecurityContextTest extends
AbstractTomEESecurityTest {
.get().getStatus());
}
+ @TomcatUserIdentityStoreDefinition
@WebServlet(urlPatterns = "/securityContext")
public static class TestServlet extends HttpServlet {
@Inject
@@ -118,6 +120,7 @@ public class SecurityContextTest extends
AbstractTomEESecurityTest {
}
}
+ @TomcatUserIdentityStoreDefinition
@WebServlet(urlPatterns = "/securityContextPrincipal")
public static class PrincipalServlet extends HttpServlet {
@Inject
@@ -141,6 +144,7 @@ public class SecurityContextTest extends
AbstractTomEESecurityTest {
}
}
+ @TomcatUserIdentityStoreDefinition
@WebServlet(urlPatterns = "/securityContextRole")
public static class RoleServlet extends HttpServlet {
@Inject
diff --git
a/tomee/tomee-security/src/test/java/org/apache/tomee/security/servlet/BasicAuthServletTest.java
b/tomee/tomee-security/src/test/java/org/apache/tomee/security/servlet/BasicAuthServletTest.java
index 93c06c3..3ab8894 100644
---
a/tomee/tomee-security/src/test/java/org/apache/tomee/security/servlet/BasicAuthServletTest.java
+++
b/tomee/tomee-security/src/test/java/org/apache/tomee/security/servlet/BasicAuthServletTest.java
@@ -17,6 +17,7 @@
package org.apache.tomee.security.servlet;
import org.apache.tomee.security.AbstractTomEESecurityTest;
+import org.apache.tomee.security.cdi.TomcatUserIdentityStoreDefinition;
import org.apache.tomee.security.client.BasicAuthFilter;
import org.junit.Test;
@@ -79,6 +80,7 @@ public class BasicAuthServletTest extends
AbstractTomEESecurityTest {
.get().getStatus());
}
+ @TomcatUserIdentityStoreDefinition
@WebServlet(urlPatterns = "/basic")
@ServletSecurity(@HttpConstraint(rolesAllowed = "tomcat"))
@BasicAuthenticationMechanismDefinition
diff --git
a/tomee/tomee-security/src/test/java/org/apache/tomee/security/servlet/FormAuthServletTest.java
b/tomee/tomee-security/src/test/java/org/apache/tomee/security/servlet/FormAuthServletTest.java
index c695223..efb6873 100644
---
a/tomee/tomee-security/src/test/java/org/apache/tomee/security/servlet/FormAuthServletTest.java
+++
b/tomee/tomee-security/src/test/java/org/apache/tomee/security/servlet/FormAuthServletTest.java
@@ -21,6 +21,7 @@ import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import org.apache.tomee.security.AbstractTomEESecurityTest;
+import org.apache.tomee.security.cdi.TomcatUserIdentityStoreDefinition;
import org.junit.Test;
import
javax.security.enterprise.authentication.mechanism.http.FormAuthenticationMechanismDefinition;
@@ -54,6 +55,7 @@ public class FormAuthServletTest extends
AbstractTomEESecurityTest {
assertEquals("ok!", webClient.getPage(getAppUrl() +
"/form").getWebResponse().getContentAsString());
}
+ @TomcatUserIdentityStoreDefinition
@WebServlet(urlPatterns = "/login")
public static class LoginServlet extends HttpServlet {
@Override
@@ -86,6 +88,7 @@ public class FormAuthServletTest extends
AbstractTomEESecurityTest {
}
}
+ @TomcatUserIdentityStoreDefinition
@WebServlet(urlPatterns = "/form")
@ServletSecurity(@HttpConstraint(rolesAllowed = "tomcat"))
@FormAuthenticationMechanismDefinition(
diff --git
a/tomee/tomee-security/src/test/java/org/apache/tomee/security/servlet/SimpleServletTest.java
b/tomee/tomee-security/src/test/java/org/apache/tomee/security/servlet/SimpleServletTest.java
index 7b37d51..bed87ea 100644
---
a/tomee/tomee-security/src/test/java/org/apache/tomee/security/servlet/SimpleServletTest.java
+++
b/tomee/tomee-security/src/test/java/org/apache/tomee/security/servlet/SimpleServletTest.java
@@ -17,6 +17,7 @@
package org.apache.tomee.security.servlet;
import org.apache.tomee.security.AbstractTomEESecurityTest;
+import org.apache.tomee.security.cdi.TomcatUserIdentityStoreDefinition;
import org.junit.Test;
import javax.servlet.ServletException;
@@ -42,6 +43,7 @@ public class SimpleServletTest extends
AbstractTomEESecurityTest {
assertEquals(200, response.getStatus());
}
+ @TomcatUserIdentityStoreDefinition
@WebServlet(urlPatterns = "/servlet")
public static class TestServlet extends HttpServlet {
@Override