Commit a490aef8 authored by Phillip Webb's avatar Phillip Webb

Merge remote-tracking branch 'springsource/1.1.x'

Conflicts:
	spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/SecurityAutoConfigurationTests.java
parents aa2e32a0 8ba71c88
...@@ -32,7 +32,6 @@ import org.springframework.context.annotation.Bean; ...@@ -32,7 +32,6 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.security.authentication.AuthenticationEventPublisher; import org.springframework.security.authentication.AuthenticationEventPublisher;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
...@@ -42,6 +41,8 @@ import org.springframework.security.config.annotation.ObjectPostProcessor; ...@@ -42,6 +41,8 @@ import org.springframework.security.config.annotation.ObjectPostProcessor;
import org.springframework.security.config.annotation.SecurityConfigurer; import org.springframework.security.config.annotation.SecurityConfigurer;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.authentication.configurers.GlobalAuthenticationConfigurerAdapter; import org.springframework.security.config.annotation.authentication.configurers.GlobalAuthenticationConfigurerAdapter;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
...@@ -57,8 +58,8 @@ import org.springframework.stereotype.Component; ...@@ -57,8 +58,8 @@ import org.springframework.stereotype.Component;
*/ */
@Configuration @Configuration
@ConditionalOnBean(ObjectPostProcessor.class) @ConditionalOnBean(ObjectPostProcessor.class)
@ConditionalOnMissingBean(AuthenticationManager.class) @ConditionalOnMissingBean({ AuthenticationManager.class })
@Order(Ordered.LOWEST_PRECEDENCE - 3) @Order(0)
public class AuthenticationManagerConfiguration extends public class AuthenticationManagerConfiguration extends
GlobalAuthenticationConfigurerAdapter { GlobalAuthenticationConfigurerAdapter {
...@@ -84,18 +85,27 @@ public class AuthenticationManagerConfiguration extends ...@@ -84,18 +85,27 @@ public class AuthenticationManagerConfiguration extends
@Bean @Bean
@Primary @Primary
public AuthenticationManager authenticationManager(AuthenticationManagerBuilder auth) public AuthenticationManager authenticationManager(AuthenticationManagerBuilder auth,
throws Exception { ApplicationContext context) throws Exception {
if (isAuthenticationManagerAlreadyConfigured(context)) {
return new LazyAuthenticationManager(auth);
}
/* /*
* This AuthenticationManagerBuilder is for the global AuthenticationManager * This AuthenticationManagerBuilder is for the global AuthenticationManager
*/ */
BootDefaultingAuthenticationConfigurerAdapter configurer = new BootDefaultingAuthenticationConfigurerAdapter(); BootDefaultingAuthenticationConfigurerAdapter configurer = new BootDefaultingAuthenticationConfigurerAdapter();
configurer.init(auth);
configurer.configure(auth); configurer.configure(auth);
AuthenticationManager manager = configurer.getAuthenticationManagerBuilder() AuthenticationManager manager = configurer.getAuthenticationManagerBuilder()
.getOrBuild(); .getOrBuild();
configurer.configureParent(auth); configurer.configureParent(auth);
return manager; return manager;
}
private boolean isAuthenticationManagerAlreadyConfigured(ApplicationContext context) {
return context.getBeanNamesForType(GlobalAuthenticationConfigurerAdapter.class).length > 2;
} }
@Component @Component
...@@ -142,8 +152,7 @@ public class AuthenticationManagerConfiguration extends ...@@ -142,8 +152,7 @@ public class AuthenticationManagerConfiguration extends
* methods are invoked before configure, which cannot be guaranteed at this point.</li> * methods are invoked before configure, which cannot be guaranteed at this point.</li>
* </ul> * </ul>
*/ */
private class BootDefaultingAuthenticationConfigurerAdapter extends private class BootDefaultingAuthenticationConfigurerAdapter {
GlobalAuthenticationConfigurerAdapter {
private AuthenticationManagerBuilder defaultAuth; private AuthenticationManagerBuilder defaultAuth;
...@@ -159,7 +168,6 @@ public class AuthenticationManagerConfiguration extends ...@@ -159,7 +168,6 @@ public class AuthenticationManagerConfiguration extends
return this.defaultAuth; return this.defaultAuth;
} }
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception { public void configure(AuthenticationManagerBuilder auth) throws Exception {
if (auth.isConfigured()) { if (auth.isConfigured()) {
this.defaultAuth = auth; this.defaultAuth = auth;
...@@ -188,4 +196,20 @@ public class AuthenticationManagerConfiguration extends ...@@ -188,4 +196,20 @@ public class AuthenticationManagerConfiguration extends
} }
} }
private static class LazyAuthenticationManager implements AuthenticationManager {
private AuthenticationManagerBuilder builder;
public LazyAuthenticationManager(AuthenticationManagerBuilder builder) {
this.builder = builder;
}
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
return this.builder.getOrBuild().authenticate(authentication);
}
}
} }
...@@ -20,7 +20,6 @@ import java.util.List; ...@@ -20,7 +20,6 @@ import java.util.List;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import org.junit.After; import org.junit.After;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
...@@ -35,6 +34,7 @@ import org.springframework.context.ApplicationEvent; ...@@ -35,6 +34,7 @@ import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.mock.web.MockServletContext; import org.springframework.mock.web.MockServletContext;
import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
...@@ -174,7 +174,8 @@ public class SecurityAutoConfigurationTests { ...@@ -174,7 +174,8 @@ public class SecurityAutoConfigurationTests {
catch (BadCredentialsException e) { catch (BadCredentialsException e) {
// expected // expected
} }
assertTrue(wrapper.get() instanceof AuthenticationFailureBadCredentialsEvent); assertTrue("Wrong event type: " + wrapper.get(),
wrapper.get() instanceof AuthenticationFailureBadCredentialsEvent);
} }
@Test @Test
...@@ -206,7 +207,6 @@ public class SecurityAutoConfigurationTests { ...@@ -206,7 +207,6 @@ public class SecurityAutoConfigurationTests {
} }
@Test @Test
@Ignore("gh-1801")
public void testOverrideAuthenticationManagerWithBuilderAndInjectIntoSecurityFilter() public void testOverrideAuthenticationManagerWithBuilderAndInjectIntoSecurityFilter()
throws Exception { throws Exception {
this.context = new AnnotationConfigWebApplicationContext(); this.context = new AnnotationConfigWebApplicationContext();
...@@ -315,6 +315,7 @@ public class SecurityAutoConfigurationTests { ...@@ -315,6 +315,7 @@ public class SecurityAutoConfigurationTests {
} }
@Configuration @Configuration
@Order(-1)
protected static class AuthenticationManagerCustomizer extends protected static class AuthenticationManagerCustomizer extends
GlobalAuthenticationConfigurerAdapter { GlobalAuthenticationConfigurerAdapter {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment