Skip to content

Commit 7b6fd59

Browse files
committed
Multiple <authentication-manager> Do Not Duplicate Alias
Previously, two authentication managers with different ids would duplicate the alias to the global authentication manager. This would cause failures for when allowBeanDefinitionOverriding = false. This commit ensures that if the global authentication manager alias is already set, then it is not set again. This means the first <authentication-manager> will be used as the global AuthenticationManager. Closes gh-8767
1 parent 286e958 commit 7b6fd59

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

config/src/main/java/org/springframework/security/config/authentication/AuthenticationManagerBeanDefinitionParser.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,9 @@ public BeanDefinition parse(Element element, ParserContext pc) {
102102
pc.getRegistry().registerAlias(id, alias);
103103
pc.getReaderContext().fireAliasRegistered(id, alias, pc.extractSource(element));
104104
}
105-
if (!BeanIds.AUTHENTICATION_MANAGER.equals(id)) {
105+
if (!BeanIds.AUTHENTICATION_MANAGER.equals(id)
106+
&& !pc.getRegistry().containsBeanDefinition(BeanIds.AUTHENTICATION_MANAGER)
107+
&& !pc.getRegistry().isAlias(BeanIds.AUTHENTICATION_MANAGER)) {
106108
pc.getRegistry().registerAlias(id, BeanIds.AUTHENTICATION_MANAGER);
107109
pc.getReaderContext().fireAliasRegistered(id, BeanIds.AUTHENTICATION_MANAGER, pc.extractSource(element));
108110
}

config/src/test/java/org/springframework/security/config/authentication/AuthenticationManagerBeanDefinitionParserTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@
2626
import org.springframework.context.ApplicationListener;
2727
import org.springframework.context.ConfigurableApplicationContext;
2828
import org.springframework.security.authentication.AuthenticationEventPublisher;
29+
import org.springframework.security.authentication.AuthenticationManager;
2930
import org.springframework.security.authentication.AuthenticationProvider;
3031
import org.springframework.security.authentication.DefaultAuthenticationEventPublisher;
3132
import org.springframework.security.authentication.ProviderManager;
3233
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
3334
import org.springframework.security.authentication.event.AbstractAuthenticationEvent;
3435
import org.springframework.security.config.test.SpringTestContext;
3536
import org.springframework.security.config.test.SpringTestContextExtension;
37+
import org.springframework.security.config.util.InMemoryXmlWebApplicationContext;
3638
import org.springframework.security.util.FieldUtils;
3739
import org.springframework.test.web.servlet.MockMvc;
3840

@@ -89,6 +91,16 @@ public void onlyOneEventPublisherIsRegisteredForMultipleAuthenticationManagers()
8991
assertThat(context.getBeansOfType(AuthenticationEventPublisher.class)).hasSize(1);
9092
}
9193

94+
@Test
95+
// gh-8767
96+
public void multipleAuthenticationManagersAndDisableBeanDefinitionOverridingThenNoException() {
97+
InMemoryXmlWebApplicationContext xmlContext = new InMemoryXmlWebApplicationContext(
98+
CONTEXT + '\n' + CONTEXT_MULTI);
99+
xmlContext.setAllowBeanDefinitionOverriding(false);
100+
ConfigurableApplicationContext context = this.spring.context(xmlContext).getContext();
101+
assertThat(context.getBeansOfType(AuthenticationManager.class)).hasSize(2);
102+
}
103+
92104
@Test
93105
public void eventsArePublishedByDefault() throws Exception {
94106
ConfigurableApplicationContext appContext = this.spring.context(CONTEXT).getContext();

0 commit comments

Comments
 (0)