Skip to content

Commit fe99c3b

Browse files
authored
https://stackoverflow.com/questions/67520600/redirect-to-different-page-after-login-based-on-user-role-with-spring-security/67531436#67531436
Closes gh-7282
1 parent da9d741 commit fe99c3b

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2018 the original author or authors.
2+
* Copyright 2002-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -57,6 +57,8 @@ public class AuthenticationManagerBeanDefinitionParser implements BeanDefinition
5757

5858
private static final String ATT_ERASE_CREDENTIALS = "erase-credentials";
5959

60+
private static final String AUTHENTICATION_EVENT_PUBLISHER_BEAN_NAME = "defaultAuthenticationEventPublisher";
61+
6062
@Override
6163
public BeanDefinition parse(Element element, ParserContext pc) {
6264
String id = element.getAttribute("id");
@@ -86,11 +88,15 @@ public BeanDefinition parse(Element element, ParserContext pc) {
8688
if ("false".equals(element.getAttribute(ATT_ERASE_CREDENTIALS))) {
8789
providerManagerBldr.addPropertyValue("eraseCredentialsAfterAuthentication", false);
8890
}
89-
// Add the default event publisher
90-
BeanDefinition publisher = new RootBeanDefinition(DefaultAuthenticationEventPublisher.class);
91-
String pubId = pc.getReaderContext().generateBeanName(publisher);
92-
pc.registerBeanComponent(new BeanComponentDefinition(publisher, pubId));
93-
providerManagerBldr.addPropertyReference("authenticationEventPublisher", pubId);
91+
92+
if (!pc.getRegistry().containsBeanDefinition(AUTHENTICATION_EVENT_PUBLISHER_BEAN_NAME)) {
93+
// Add the default event publisher to the context
94+
BeanDefinition publisher = new RootBeanDefinition(DefaultAuthenticationEventPublisher.class);
95+
pc.registerBeanComponent(new BeanComponentDefinition(publisher, AUTHENTICATION_EVENT_PUBLISHER_BEAN_NAME));
96+
}
97+
98+
providerManagerBldr.addPropertyReference("authenticationEventPublisher",
99+
AUTHENTICATION_EVENT_PUBLISHER_BEAN_NAME);
94100
pc.registerBeanComponent(new BeanComponentDefinition(providerManagerBldr.getBeanDefinition(), id));
95101
if (StringUtils.hasText(alias)) {
96102
pc.getRegistry().registerAlias(id, alias);

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2016 the original author or authors.
2+
* Copyright 2002-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@
2525
import org.springframework.beans.factory.annotation.Autowired;
2626
import org.springframework.context.ApplicationListener;
2727
import org.springframework.context.ConfigurableApplicationContext;
28+
import org.springframework.security.authentication.AuthenticationEventPublisher;
2829
import org.springframework.security.authentication.AuthenticationProvider;
2930
import org.springframework.security.authentication.DefaultAuthenticationEventPublisher;
3031
import org.springframework.security.authentication.ProviderManager;
@@ -54,6 +55,17 @@ public class AuthenticationManagerBeanDefinitionParserTests {
5455
+ "</authentication-manager>";
5556
// @formatter:on
5657

58+
// Issue #7282
59+
// @formatter:off
60+
private static final String CONTEXT_MULTI = "<authentication-manager id='amSecondary'>"
61+
+ " <authentication-provider>"
62+
+ " <user-service>"
63+
+ " <user name='john' password='{noop}doe' authorities='ROLE_C,ROLE_D' />"
64+
+ " </user-service>"
65+
+ " </authentication-provider>"
66+
+ "</authentication-manager>";
67+
// @formatter:on
68+
5769
@Rule
5870
public final SpringTestRule spring = new SpringTestRule();
5971

@@ -64,6 +76,18 @@ public void providersAreRegisteredAsTopLevelBeans() {
6476
assertThat(context.getBeansOfType(AuthenticationProvider.class)).hasSize(1);
6577
}
6678

79+
@Test
80+
public void eventPublishersAreRegisteredAsTopLevelBeans() {
81+
ConfigurableApplicationContext context = this.spring.context(CONTEXT).getContext();
82+
assertThat(context.getBeansOfType(AuthenticationEventPublisher.class)).hasSize(1);
83+
}
84+
85+
@Test
86+
public void onlyOneEventPublisherIsRegisteredForMultipleAuthenticationManagers() {
87+
ConfigurableApplicationContext context = this.spring.context(CONTEXT + '\n' + CONTEXT_MULTI).getContext();
88+
assertThat(context.getBeansOfType(AuthenticationEventPublisher.class)).hasSize(1);
89+
}
90+
6791
@Test
6892
public void eventsArePublishedByDefault() throws Exception {
6993
ConfigurableApplicationContext appContext = this.spring.context(CONTEXT).getContext();

0 commit comments

Comments
 (0)