diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/AuthenticationManagerConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/AuthenticationManagerConfiguration.java index dfc06f9e66a..d759fe42f3e 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/AuthenticationManagerConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/AuthenticationManagerConfiguration.java @@ -26,12 +26,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.security.SecurityProperties.User; +import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.security.authentication.AuthenticationEventPublisher; @@ -54,7 +56,8 @@ import org.springframework.security.config.annotation.authentication.configurers @ConditionalOnMissingBean(AuthenticationManager.class) @Order(Ordered.LOWEST_PRECEDENCE - 3) public class AuthenticationManagerConfiguration extends - GlobalAuthenticationConfigurerAdapter { + GlobalAuthenticationConfigurerAdapter implements + ApplicationListener { private static Log logger = LogFactory .getLog(AuthenticationManagerConfiguration.class); @@ -79,23 +82,23 @@ public class AuthenticationManagerConfiguration extends } @Bean - // avoid issues with scopedTarget (SPR-11548) @Primary - public AuthenticationManager authenticationManager() { - return lazyAuthenticationManager(); - } - - @Bean @Lazy @Scope(proxyMode = ScopedProxyMode.INTERFACES) - protected AuthenticationManager lazyAuthenticationManager() { + public AuthenticationManager authenticationManager() { + AuthenticationManager manager = this.configurer.getAuthenticationManagerBuilder() + .getOrBuild(); + return manager; + } + + @Override + public void onApplicationEvent(ContextRefreshedEvent event) { AuthenticationManager manager = this.configurer.getAuthenticationManagerBuilder() .getOrBuild(); if (manager instanceof ProviderManager) { ((ProviderManager) manager) .setAuthenticationEventPublisher(this.authenticationEventPublisher); } - return manager; } /** diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/SecurityAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/SecurityAutoConfigurationTests.java index 589c2228245..e736b05c39b 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/SecurityAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/SecurityAutoConfigurationTests.java @@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.security; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; import org.junit.Test; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; @@ -26,12 +27,17 @@ import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfigurat import org.springframework.boot.autoconfigure.orm.jpa.test.City; import org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration; import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.mock.web.MockServletContext; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.TestingAuthenticationToken; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.authentication.event.AuthenticationFailureBadCredentialsEvent; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; @@ -41,6 +47,8 @@ import org.springframework.web.context.support.AnnotationConfigWebApplicationCon import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; /** * Tests for {@link SecurityAutoConfiguration}. @@ -104,6 +112,27 @@ public class SecurityAutoConfigurationTests { assertNotNull(this.context.getBean(AuthenticationManager.class)); } + @Test + public void testEventPublisherInjected() throws Exception { + testAuthenticationManagerCreated(); + final AtomicReference wrapper = new AtomicReference(); + this.context.addApplicationListener(new ApplicationListener() { + @Override + public void onApplicationEvent(ApplicationEvent event) { + wrapper.set(event); + }; + }); + AuthenticationManager manager = this.context.getBean(AuthenticationManager.class); + try { + manager.authenticate(new UsernamePasswordAuthenticationToken("foo", "bar")); + fail("Expected BadCredentialsException"); + } + catch (BadCredentialsException e) { + // expected + } + assertTrue(wrapper.get() instanceof AuthenticationFailureBadCredentialsEvent); + } + @Test public void testOverrideAuthenticationManager() throws Exception { this.context = new AnnotationConfigWebApplicationContext(); diff --git a/spring-boot-samples/spring-boot-sample-parent-context/pom.xml b/spring-boot-samples/spring-boot-sample-parent-context/pom.xml index ddf256b22f5..4956c5ab820 100644 --- a/spring-boot-samples/spring-boot-sample-parent-context/pom.xml +++ b/spring-boot-samples/spring-boot-sample-parent-context/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 @@ -16,6 +17,7 @@ http://www.spring.io + sample.parent.SampleParentContextApplication ${basedir}/../..