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 11dbad4ca85..74cd06b8a7b 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 @@ -42,6 +42,7 @@ import org.springframework.security.config.annotation.SecurityConfigurer; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; import org.springframework.security.config.annotation.authentication.configurers.GlobalAuthenticationConfigurerAdapter; +import org.springframework.security.config.annotation.authentication.configurers.provisioning.InMemoryUserDetailsManagerConfigurer; import org.springframework.stereotype.Component; /** @@ -138,22 +139,59 @@ public class AuthenticationManagerConfiguration { @Override public void init(AuthenticationManagerBuilder auth) throws Exception { - if (auth.isConfigured()) { - return; + auth.apply(new DefaultingInMemoryUserDetailsManagerConfigurer(this.security)); + } + + /** + * This is necessary to delay adding the default user. + * + * + * + * @author Rob Winch + */ + private static class DefaultingInMemoryUserDetailsManagerConfigurer extends + InMemoryUserDetailsManagerConfigurer { + private final SecurityProperties security; + + public DefaultingInMemoryUserDetailsManagerConfigurer( + SecurityProperties security) { + this.security = security; } - User user = this.security.getUser(); - if (user.isDefaultPassword()) { - logger.info("\n\nUsing default security password: " + user.getPassword() - + "\n"); + @Override + public void configure(AuthenticationManagerBuilder auth) throws Exception { + if (auth.isConfigured()) { + return; + } + + User user = this.security.getUser(); + if (user.isDefaultPassword()) { + logger.info("\n\nUsing default security password: " + + user.getPassword() + "\n"); + } + + Set roles = new LinkedHashSet(user.getRole()); + withUser(user.getName()).password(user.getPassword()).roles( + roles.toArray(new String[roles.size()])); + + super.configure(auth); } - Set roles = new LinkedHashSet(user.getRole()); - auth.inMemoryAuthentication().withUser(user.getName()) - .password(user.getPassword()) - .roles(roles.toArray(new String[roles.size()])); } } - -} +} \ No newline at end of file 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 b662ae7e1bb..f743f6da58c 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -256,6 +256,49 @@ public class SecurityAutoConfigurationTests { assertNotNull(this.context.getBean(JpaTransactionManager.class)); } + @Test + public void testDefaultUsernamePassword() throws Exception { + this.context = new AnnotationConfigWebApplicationContext(); + this.context.setServletContext(new MockServletContext()); + + this.context.register(SecurityAutoConfiguration.class, + ServerPropertiesAutoConfiguration.class); + this.context.refresh(); + + SecurityProperties security = this.context.getBean(SecurityProperties.class); + AuthenticationManager manager = this.context.getBean(AuthenticationManager.class); + + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( + security.getUser().getName(), security.getUser().getPassword()); + assertNotNull(manager.authenticate(token)); + } + + @Test + public void testCustomAuthenticationDoesNotAuthenticateWithBootSecurityUser() + throws Exception { + this.context = new AnnotationConfigWebApplicationContext(); + this.context.setServletContext(new MockServletContext()); + + this.context.register(AuthenticationManagerCustomizer.class, + SecurityAutoConfiguration.class, ServerPropertiesAutoConfiguration.class); + this.context.refresh(); + + SecurityProperties security = this.context.getBean(SecurityProperties.class); + AuthenticationManager manager = this.context.getBean(AuthenticationManager.class); + + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( + security.getUser().getName(), security.getUser().getPassword()); + try { + manager.authenticate(token); + fail("Expected Exception"); + } + catch (AuthenticationException success) { + } + + token = new UsernamePasswordAuthenticationToken("foo", "bar"); + assertNotNull(manager.authenticate(token)); + } + private static final class AuthenticationListener implements ApplicationListener {