Skip to content

Commit dde5082

Browse files
authored
Merge pull request #23234 from Zech-Hein/fix-javaee-security-alternative
fix javaEE Security authMech alternative-annotation logic
2 parents 65c4739 + 8e0025a commit dde5082

File tree

4 files changed

+78
-10
lines changed

4 files changed

+78
-10
lines changed

dev/com.ibm.ws.security.javaeesec.cdi/src/com/ibm/ws/security/javaeesec/cdi/extensions/HttpAuthenticationMechanismsTracker.java

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,35 @@ public void addAuthMech(String applicationName, Class<?> annotatedClass, Class<?
126126
}
127127
}
128128

129+
public Properties removeAuthMech(String applicationName, Class<?> implClass) {
130+
return removeAuthMech(applicationName, implClass, implClass);
131+
}
132+
133+
public Properties removeAuthMech(String applicationName, Class<?> annotatedClass, Class<?> implClass) {
134+
Map<String, ModuleProperties> moduleMap = moduleMapsPerApplication.get(applicationName);
135+
String moduleName = getModuleFromClass(annotatedClass, moduleMap);
136+
137+
if (tc.isDebugEnabled()) {
138+
Tr.debug(tc, "moduleName: " + moduleName);
139+
}
140+
141+
if (moduleMap.containsKey(moduleName)) {
142+
return moduleMap.get(moduleName).removeFromAuthMechMap(implClass);
143+
} else {
144+
// if there is no match in the module name, it should be a shared jar file.
145+
// so the authmech needs to be removed from all modules.
146+
if (tc.isDebugEnabled()) {
147+
Tr.debug(tc, "Remove the AuthMech from all modules since the module is not found. Module: " + moduleName);
148+
}
149+
150+
Properties props = null;
151+
for (Map.Entry<String, ModuleProperties> entry : moduleMap.entrySet()) {
152+
props = entry.getValue().removeFromAuthMechMap(implClass);
153+
}
154+
return props;
155+
}
156+
}
157+
129158
/**
130159
* Identify the module name from the class. If the class exists in the jar file, return war file name
131160
* if it is located under the war file, otherwise returning jar file name.
@@ -165,19 +194,31 @@ protected String getClassFileLocation(Class<?> annotatedClass) {
165194
}
166195

167196
public boolean existAuthMech(String applicationName, Class<?> authMechToExist) {
197+
return (null != getExistingAuthMechClass(applicationName, authMechToExist));
198+
}
199+
200+
public Class<?> getExistingAuthMechClass(String applicationName) {
201+
return getExistingAuthMechClass(applicationName, null);
202+
}
203+
204+
public Class<?> getExistingAuthMechClass(String applicationName, Class<?> authMechToExist) {
168205
Map<Class<?>, Properties> authMechs = null;
169206
Map<String, ModuleProperties> moduleMap = moduleMapsPerApplication.get(applicationName);
170207
if (moduleMap != null) {
171208
for (Map.Entry<String, ModuleProperties> entry : moduleMap.entrySet()) {
172209
authMechs = entry.getValue().getAuthMechMap();
173210
for (Class<?> authMech : authMechs.keySet()) {
174-
if (authMech.equals(authMechToExist)) {
175-
return true;
211+
if (authMechToExist != null) {
212+
if (authMech.equals(authMechToExist)) {
213+
return authMech;
214+
}
215+
} else {
216+
return authMech;
176217
}
177218
}
178219
}
179220
}
180-
return false;
221+
return null;
181222
}
182223

183224
public Map<Class<?>, Properties> getAuthMechs(String applicationName, String moduleName) {

dev/com.ibm.ws.security.javaeesec.cdi/src/com/ibm/ws/security/javaeesec/cdi/extensions/JavaEESecCDIExtension.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.Set;
2929

3030
import javax.enterprise.event.Observes;
31+
import javax.enterprise.inject.Alternative;
3132
import javax.enterprise.inject.spi.AfterBeanDiscovery;
3233
import javax.enterprise.inject.spi.AnnotatedType;
3334
import javax.enterprise.inject.spi.Bean;
@@ -90,6 +91,7 @@ public class JavaEESecCDIExtension<T> implements Extension, WebSphereCDIExtensio
9091
private final Set<Bean> beansToAdd = new HashSet<Bean>();
9192
private boolean identityStoreHandlerRegistered = false;
9293
private boolean identityStoreRegistered = false;
94+
private boolean isAlternativeHAMAdded = false;
9395
private final String applicationName;
9496
private final List<LdapIdentityStoreDefinition> ldapDefinitionList = new ArrayList<LdapIdentityStoreDefinition>();
9597
private final List<DatabaseIdentityStoreDefinition> databaseDefinitionList = new ArrayList<DatabaseIdentityStoreDefinition>();
@@ -155,7 +157,8 @@ public <T> void processAnnotatedType(ProcessAnnotatedType<T> processAnnotatedTyp
155157
createModulePropertiesProviderBeanForGlobalLogin(beanManager, javaClass);
156158
} else {
157159
Annotation ltc = annotatedType.getAnnotation(LoginToContinue.class);
158-
createModulePropertiesProviderBeanForApplicationAuthMechToAdd(beanManager, ltc, javaClass);
160+
Annotation alternative = annotatedType.getAnnotation(Alternative.class);
161+
createModulePropertiesProviderBeanForApplicationAuthMechToAdd(beanManager, ltc, alternative, javaClass);
159162
}
160163
}
161164
//look at the class level annotations
@@ -322,7 +325,7 @@ private void createModulePropertiesProviderBeanForBasicToAdd(BeanManager beanMan
322325
* @param implClass the implementation class
323326
*/
324327
@SuppressWarnings("rawtypes")
325-
private void createModulePropertiesProviderBeanForApplicationAuthMechToAdd(BeanManager beanManager, Annotation ltc, Class implClass) {
328+
private void createModulePropertiesProviderBeanForApplicationAuthMechToAdd(BeanManager beanManager, Annotation ltc, Annotation alternative, Class implClass) {
326329
Properties props = null;
327330
if (ltc != null) {
328331
try {
@@ -333,7 +336,22 @@ private void createModulePropertiesProviderBeanForApplicationAuthMechToAdd(BeanM
333336
e.printStackTrace();
334337
}
335338
}
336-
addAuthMech(applicationName, implClass, implClass, props);
339+
boolean isAlternative = (alternative != null);
340+
if (isAlternative) {
341+
// Use the alternative instead of the existing authMech
342+
Class<?> existingAuthMechClass = httpAuthenticationMechanismsTracker.getExistingAuthMechClass(applicationName);
343+
boolean authMechAlreadyExists = (existingAuthMechClass != null);
344+
if (authMechAlreadyExists) {
345+
httpAuthenticationMechanismsTracker.removeAuthMech(applicationName, existingAuthMechClass);
346+
}
347+
addAuthMech(applicationName, implClass, props);
348+
isAlternativeHAMAdded = true;
349+
if (tc.isDebugEnabled()) {
350+
Tr.debug(tc, "adding alternative HAM: " + implClass);
351+
}
352+
} else if (!isAlternativeHAMAdded) {
353+
addAuthMech(applicationName, implClass, props);
354+
}
337355
}
338356

339357
/**
@@ -365,6 +383,10 @@ public void addAuthMech(String applicationName, Class<?> annotatedClass, Class<?
365383
httpAuthenticationMechanismsTracker.addAuthMech(applicationName, annotatedClass, implClass, props);
366384
}
367385

386+
public void addAuthMech(String applicationName, Class<?> implClass, Properties props) {
387+
httpAuthenticationMechanismsTracker.addAuthMech(applicationName, implClass, implClass, props);
388+
}
389+
368390
/**
369391
* @param ltcAnnotation
370392
*/

dev/com.ibm.ws.security.javaeesec.cdi/test/com/ibm/ws/security/javaeesec/cdi/extensions/JavaEESecCDIExtensionTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.util.Set;
3333

3434
import javax.enterprise.context.spi.CreationalContext;
35+
import javax.enterprise.inject.Alternative;
3536
import javax.enterprise.inject.spi.AfterBeanDiscovery;
3637
import javax.enterprise.inject.spi.AnnotatedType;
3738
import javax.enterprise.inject.spi.Bean;
@@ -322,6 +323,8 @@ public void processAnnotatedTypeApplicationHAM() {
322323
will(returnValue(at1));
323324
one(at1).getAnnotation(LoginToContinue.class);
324325
will(returnValue(ltc));
326+
one(at1).getAnnotation(Alternative.class);
327+
will(returnValue(null));
325328
one(wasc).getOverrideHttpAuthMethod();
326329
will(returnValue(null));
327330
one(at1).getAnnotations();

dev/com.ibm.ws.security.javaeesec/src/com/ibm/ws/security/javaeesec/properties/ModuleProperties.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2017 IBM Corporation and others.
2+
* Copyright (c) 2017, 2022 IBM Corporation and others.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -15,9 +15,6 @@
1515
import java.util.Map;
1616
import java.util.Properties;
1717

18-
import com.ibm.websphere.ras.Tr;
19-
import com.ibm.websphere.ras.TraceComponent;
20-
2118
public class ModuleProperties {
2219
private Map<Class<?>, Properties> authMechMap;
2320
private URL location;
@@ -45,6 +42,7 @@ public ModuleProperties() {
4542
public Map<Class<?>, Properties> getAuthMechMap() {
4643
return authMechMap;
4744
}
45+
4846
public Properties getFromAuthMechMap(Class<?> className) {
4947
return authMechMap.get(className);
5048
}
@@ -56,4 +54,8 @@ public URL getLocation() {
5654
public Properties putToAuthMechMap(Class<?> className, Properties props) {
5755
return authMechMap.put(className, props);
5856
}
57+
58+
public Properties removeFromAuthMechMap(Class<?> className) {
59+
return authMechMap.remove(className);
60+
}
5961
}

0 commit comments

Comments
 (0)