diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/CrshAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/CrshAutoConfiguration.java
index 9916efe17f4..f10d74ab806 100644
--- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/CrshAutoConfiguration.java
+++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/CrshAutoConfiguration.java
@@ -44,8 +44,7 @@ import org.crsh.vfs.spi.AbstractFSDriver;
import org.crsh.vfs.spi.FSDriver;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.actuate.properties.SecurityProperties;
-import org.springframework.boot.actuate.properties.SecurityProperties.Management;
+import org.springframework.boot.actuate.properties.ManagementServerProperties;
import org.springframework.boot.actuate.properties.ShellProperties;
import org.springframework.boot.actuate.properties.ShellProperties.CrshShellAuthenticationProperties;
import org.springframework.boot.actuate.properties.ShellProperties.CrshShellProperties;
@@ -96,8 +95,9 @@ import org.springframework.util.StringUtils;
* Security. This authentication method will get enabled if shell.auth is set
* to spring or if no explicit shell.auth is provided and a
* {@link AuthenticationManager} is available. In the latter case shell access will be
- * restricted to users having roles that match those configured in {@link Management}.
- * Required roles can be overridden by shell.auth.spring.roles.
+ * restricted to users having roles that match those configured in
+ * {@link ManagementServerProperties}. Required roles can be overridden by
+ * shell.auth.spring.roles.
*
*
* To add customizations to the shell simply define beans of type {@link CRaSHPlugin} in
@@ -119,7 +119,7 @@ import org.springframework.util.StringUtils;
@Configuration
@ConditionalOnClass({ PluginLifeCycle.class })
@EnableConfigurationProperties({ ShellProperties.class })
-@AutoConfigureAfter(SecurityAutoConfiguration.class)
+@AutoConfigureAfter(ManagementSecurityAutoConfiguration.class)
public class CrshAutoConfiguration {
@Autowired
@@ -170,7 +170,7 @@ public class CrshAutoConfiguration {
public static class AuthenticationManagerAdapterAutoConfiguration {
@Autowired(required = false)
- private SecurityProperties securityProperties;
+ private ManagementServerProperties management;
@Bean
public CRaSHPlugin> shellAuthenticationManager() {
@@ -184,9 +184,9 @@ public class CrshAutoConfiguration {
// In case no shell.auth property is provided fall back to Spring Security
// based authentication and get role to access shell from SecurityProperties.
SpringAuthenticationProperties authenticationProperties = new SpringAuthenticationProperties();
- if (this.securityProperties != null) {
- authenticationProperties.setRoles(new String[] { this.securityProperties
- .getManagement().getRole() });
+ if (this.management != null) {
+ authenticationProperties.setRoles(new String[] { this.management
+ .getSecurity().getRole() });
}
return authenticationProperties;
}
diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfiguration.java
index 02cb85414f5..c1db1f57061 100644
--- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfiguration.java
+++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfiguration.java
@@ -52,7 +52,6 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.context.support.GenericWebApplicationContext;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.servlet.DispatcherServlet;
@@ -182,7 +181,7 @@ public class EndpointWebMvcAutoConfiguration implements ApplicationContextAware,
if (DISABLED_PORT.equals(managementServerProperties.getPort())) {
return DISABLE;
}
- if (!(beanFactory instanceof GenericWebApplicationContext)) {
+ if (!(beanFactory instanceof WebApplicationContext)) {
// Current context is no a a webapp
return DIFFERENT;
}
diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementSecurityAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementSecurityAutoConfiguration.java
new file mode 100644
index 00000000000..7de8a357d9a
--- /dev/null
+++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementSecurityAutoConfiguration.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright 2012-2013 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.boot.actuate.autoconfigure;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.servlet.Filter;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.endpoint.Endpoint;
+import org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping;
+import org.springframework.boot.actuate.properties.ManagementServerProperties;
+import org.springframework.boot.actuate.web.ErrorController;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.security.AuthenticationManagerConfiguration;
+import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.SecurityPrequisite;
+import org.springframework.boot.autoconfigure.security.SecurityProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.SecurityConfigurer;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.builders.WebSecurity;
+import org.springframework.security.config.annotation.web.builders.WebSecurity.IgnoredRequestConfigurer;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
+
+/**
+ * {@link EnableAutoConfiguration Auto-configuration} for security of framework endpoints.
+ * Many aspects of the behavior can be controller with {@link ManagementServerProperties}
+ * via externalized application properties (or via an bean definition of that type to set
+ * the defaults).
+ *
+ *
+ * The framework {@link Endpoint}s (used to expose application information to operations)
+ * include a {@link Endpoint#isSensitive() sensitive} configuration option which will be
+ * used as a security hint by the filter created here.
+ *
+ * @author Dave Syer
+ */
+@Configuration
+@ConditionalOnClass({ EnableWebSecurity.class })
+@AutoConfigureAfter(SecurityAutoConfiguration.class)
+@EnableConfigurationProperties
+public class ManagementSecurityAutoConfiguration {
+
+ private static final String[] NO_PATHS = new String[0];
+
+ @Bean
+ @ConditionalOnMissingBean({ IgnoredPathsWebSecurityConfigurerAdapter.class })
+ public SecurityConfigurer ignoredPathsWebSecurityConfigurerAdapter() {
+ return new IgnoredPathsWebSecurityConfigurerAdapter();
+ }
+
+ @Configuration
+ protected static class ManagementSecurityPropertiesConfiguration implements
+ SecurityPrequisite {
+
+ @Autowired(required = false)
+ private SecurityProperties security;
+
+ @Autowired(required = false)
+ private ManagementServerProperties management;
+
+ @PostConstruct
+ public void init() {
+ if (this.management != null && this.security != null) {
+ this.security.getUser().getRole()
+ .add(this.management.getSecurity().getRole());
+ }
+ }
+
+ }
+
+ // Get the ignored paths in early
+ @Order(Ordered.HIGHEST_PRECEDENCE + 1)
+ private static class IgnoredPathsWebSecurityConfigurerAdapter implements
+ SecurityConfigurer {
+
+ @Autowired(required = false)
+ private ErrorController errorController;
+
+ @Autowired(required = false)
+ private EndpointHandlerMapping endpointHandlerMapping;
+
+ @Autowired
+ private ManagementServerProperties management;
+
+ @Autowired
+ private SecurityProperties security;
+
+ @Override
+ public void configure(WebSecurity builder) throws Exception {
+ }
+
+ @Override
+ public void init(WebSecurity builder) throws Exception {
+ IgnoredRequestConfigurer ignoring = builder.ignoring();
+ // The ignores are not cumulative, so to prevent overwriting the defaults we
+ // add them back.
+ List ignored = SecurityAutoConfiguration.getIgnored(this.security);
+ ignored.addAll(Arrays.asList(getEndpointPaths(this.endpointHandlerMapping,
+ false)));
+ if (!this.management.getSecurity().isEnabled()) {
+ ignored.addAll(Arrays.asList(getEndpointPaths(
+ this.endpointHandlerMapping, true)));
+ }
+ if (ignored.contains("none")) {
+ ignored.remove("none");
+ }
+ if (this.errorController != null) {
+ ignored.add(this.errorController.getErrorPath());
+ }
+ ignoring.antMatchers(ignored.toArray(new String[0]));
+ }
+
+ }
+
+ @Configuration
+ @ConditionalOnMissingBean({ ManagementWebSecurityConfigurerAdapter.class })
+ @ConditionalOnExpression("${management.security.enabled:true}")
+ @EnableWebSecurity
+ // Give user-supplied filters a chance to be last in line
+ @Order(Ordered.LOWEST_PRECEDENCE - 10)
+ protected static class ManagementWebSecurityConfigurerAdapter extends
+ WebSecurityConfigurerAdapter {
+
+ @Autowired
+ private SecurityProperties security;
+
+ @Autowired
+ private ManagementServerProperties management;
+
+ @Autowired(required = false)
+ private EndpointHandlerMapping endpointHandlerMapping;
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+
+ // secure endpoints
+ String[] paths = getEndpointPaths(this.endpointHandlerMapping, true);
+ if (paths.length > 0 && this.management.getSecurity().isEnabled()) {
+ // Always protect them if present
+ if (this.security.isRequireSsl()) {
+ http.requiresChannel().anyRequest().requiresSecure();
+ }
+ http.exceptionHandling().authenticationEntryPoint(entryPoint());
+ http.requestMatchers().antMatchers(paths);
+ http.authorizeRequests().anyRequest()
+ .hasRole(this.management.getSecurity().getRole()) //
+ .and().httpBasic() //
+ .and().anonymous().disable();
+
+ // No cookies for management endpoints by default
+ http.csrf().disable();
+ http.sessionManagement().sessionCreationPolicy(
+ this.management.getSecurity().getSessions());
+
+ SecurityAutoConfiguration.configureHeaders(http.headers(),
+ this.security.getHeaders());
+
+ }
+
+ }
+
+ private AuthenticationEntryPoint entryPoint() {
+ BasicAuthenticationEntryPoint entryPoint = new BasicAuthenticationEntryPoint();
+ entryPoint.setRealmName(this.security.getBasic().getRealm());
+ return entryPoint;
+ }
+
+ @Configuration
+ @ConditionalOnMissingBean(AuthenticationManager.class)
+ protected static class ManagementAuthenticationManagerConfiguration extends
+ AuthenticationManagerConfiguration {
+ }
+
+ }
+
+ private static String[] getEndpointPaths(
+ EndpointHandlerMapping endpointHandlerMapping, boolean secure) {
+ if (endpointHandlerMapping == null) {
+ return NO_PATHS;
+ }
+
+ List> endpoints = endpointHandlerMapping.getEndpoints();
+ List paths = new ArrayList(endpoints.size());
+ for (Endpoint> endpoint : endpoints) {
+ if (endpoint.isSensitive() == secure) {
+ paths.add(endpoint.getPath());
+ }
+ }
+ return paths.toArray(new String[paths.size()]);
+ }
+
+}
diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementServerPropertiesAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementServerPropertiesAutoConfiguration.java
index 816149ca338..2512e3c86de 100644
--- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementServerPropertiesAutoConfiguration.java
+++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementServerPropertiesAutoConfiguration.java
@@ -38,7 +38,7 @@ public class ManagementServerPropertiesAutoConfiguration {
@Bean(name = "org.springframework.actuate.properties.ManagementServerProperties")
@ConditionalOnMissingBean
- public ManagementServerProperties serverProperties() {
+ public ManagementServerProperties managementServerProperties() {
return new ManagementServerProperties();
}
diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/properties/ManagementServerProperties.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/properties/ManagementServerProperties.java
index cfaf790f21f..2f0f2638208 100644
--- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/properties/ManagementServerProperties.java
+++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/properties/ManagementServerProperties.java
@@ -20,8 +20,11 @@ import java.net.InetAddress;
import javax.validation.constraints.NotNull;
+import org.springframework.boot.autoconfigure.security.SecurityPrequisite;
import org.springframework.boot.context.embedded.properties.ServerProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.util.ClassUtils;
/**
* Properties for the management server (e.g. port and path settings).
@@ -30,7 +33,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @see ServerProperties
*/
@ConfigurationProperties(name = "management", ignoreUnknownFields = false)
-public class ManagementServerProperties {
+public class ManagementServerProperties implements SecurityPrequisite {
private Integer port;
@@ -41,6 +44,8 @@ public class ManagementServerProperties {
private boolean allowShutdown = false;
+ private Security security = maybeCreateSecurity();
+
public boolean isAllowShutdown() {
return this.allowShutdown;
}
@@ -82,4 +87,50 @@ public class ManagementServerProperties {
this.contextPath = contextPath;
}
+ public Security getSecurity() {
+ return this.security;
+ }
+
+ public static class Security {
+
+ private boolean enabled = true;
+
+ private String role = "ADMIN";
+
+ private SessionCreationPolicy sessions = SessionCreationPolicy.STATELESS;
+
+ public SessionCreationPolicy getSessions() {
+ return this.sessions;
+ }
+
+ public void setSessions(SessionCreationPolicy sessions) {
+ this.sessions = sessions;
+ }
+
+ public void setRole(String role) {
+ this.role = role;
+ }
+
+ public String getRole() {
+ return this.role;
+ }
+
+ public boolean isEnabled() {
+ return this.enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ }
+
+ private static Security maybeCreateSecurity() {
+ if (ClassUtils
+ .isPresent("org.springframework.security.core.Authentication", null)) {
+ return new Security();
+ }
+ return null;
+ }
+
}
diff --git a/spring-boot-actuator/src/main/resources/META-INF/spring.factories b/spring-boot-actuator/src/main/resources/META-INF/spring.factories
index 89736607c7d..18e4f406314 100644
--- a/spring-boot-actuator/src/main/resources/META-INF/spring.factories
+++ b/spring-boot-actuator/src/main/resources/META-INF/spring.factories
@@ -7,6 +7,6 @@ org.springframework.boot.actuate.autoconfigure.ErrorMvcAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.ManagementServerPropertiesAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.MetricRepositoryAutoConfiguration,\
-org.springframework.boot.actuate.autoconfigure.SecurityAutoConfiguration,\
+org.springframework.boot.actuate.autoconfigure.ManagementSecurityAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.TraceRepositoryAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.TraceWebFilterAutoConfiguration
diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/CrshAutoConfigurationTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/CrshAutoConfigurationTests.java
index 2e0d3a811b2..bf5d4a2242b 100644
--- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/CrshAutoConfigurationTests.java
+++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/CrshAutoConfigurationTests.java
@@ -33,6 +33,7 @@ import org.crsh.processor.term.ProcessorIOHandler;
import org.crsh.vfs.Resource;
import org.junit.After;
import org.junit.Test;
+import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mock.env.MockEnvironment;
diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/ManagementSecurityAutoConfigurationTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/ManagementSecurityAutoConfigurationTests.java
new file mode 100644
index 00000000000..8b34ecbdd39
--- /dev/null
+++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/ManagementSecurityAutoConfigurationTests.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2012-2013 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.boot.actuate.autoconfigure;
+
+import org.junit.Test;
+import org.springframework.boot.TestUtils;
+import org.springframework.boot.autoconfigure.AutoConfigurationReportLoggingInitializer;
+import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
+import org.springframework.boot.context.initializer.LoggingApplicationContextInitializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.mock.web.MockServletContext;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.ProviderManager;
+import org.springframework.security.authentication.TestingAuthenticationToken;
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.web.FilterChainProxy;
+import org.springframework.test.util.ReflectionTestUtils;
+import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests for {@link ManagementSecurityAutoConfiguration}.
+ *
+ * @author Dave Syer
+ */
+public class ManagementSecurityAutoConfigurationTests {
+
+ private AnnotationConfigWebApplicationContext context;
+
+ @Test
+ public void testWebConfiguration() throws Exception {
+ this.context = new AnnotationConfigWebApplicationContext();
+ this.context.setServletContext(new MockServletContext());
+ this.context.register(SecurityAutoConfiguration.class,
+ ManagementSecurityAutoConfiguration.class,
+ EndpointAutoConfiguration.class, EndpointWebMvcAutoConfiguration.class,
+ ManagementServerPropertiesAutoConfiguration.class,
+ PropertyPlaceholderAutoConfiguration.class);
+ this.context.refresh();
+ assertNotNull(this.context.getBean(AuthenticationManager.class));
+ // 6 for static resources, one for management endpoints and one for the rest
+ assertEquals(8, this.context.getBean(FilterChainProxy.class).getFilterChains()
+ .size());
+ }
+
+ @Test
+ public void testWebConfigurationWithExtraRole() throws Exception {
+ this.context = new AnnotationConfigWebApplicationContext();
+ this.context.setServletContext(new MockServletContext());
+ this.context.register(EndpointAutoConfiguration.class,
+ EndpointWebMvcAutoConfiguration.class,
+ ManagementServerPropertiesAutoConfiguration.class,
+ SecurityAutoConfiguration.class,
+ ManagementSecurityAutoConfiguration.class,
+ PropertyPlaceholderAutoConfiguration.class);
+ debugRefresh(this.context);
+ UserDetails user = getUser();
+ assertTrue(user.getAuthorities().containsAll(
+ AuthorityUtils
+ .commaSeparatedStringToAuthorityList("ROLE_USER,ROLE_ADMIN")));
+ }
+
+ private UserDetails getUser() {
+ ProviderManager manager = this.context.getBean(ProviderManager.class);
+ DaoAuthenticationProvider provider = (DaoAuthenticationProvider) manager
+ .getProviders().get(0);
+ UserDetailsService service = (UserDetailsService) ReflectionTestUtils.getField(
+ provider, "userDetailsService");
+ UserDetails user = service.loadUserByUsername("user");
+ return user;
+ }
+
+ @Test
+ public void testDisableIgnoredStaticApplicationPaths() throws Exception {
+ this.context = new AnnotationConfigWebApplicationContext();
+ this.context.setServletContext(new MockServletContext());
+ this.context.register(SecurityAutoConfiguration.class,
+ ManagementSecurityAutoConfiguration.class,
+ EndpointAutoConfiguration.class,
+ ManagementServerPropertiesAutoConfiguration.class,
+ PropertyPlaceholderAutoConfiguration.class);
+ TestUtils.addEnviroment(this.context, "security.ignored:none");
+ this.context.refresh();
+ // Just the application and management endpoints now
+ assertEquals(2, this.context.getBean(FilterChainProxy.class).getFilterChains()
+ .size());
+ }
+
+ @Test
+ public void testDisableBasicAuthOnApplicationPaths() throws Exception {
+ this.context = new AnnotationConfigWebApplicationContext();
+ this.context.setServletContext(new MockServletContext());
+ this.context.register(SecurityAutoConfiguration.class,
+ ManagementSecurityAutoConfiguration.class,
+ EndpointAutoConfiguration.class, EndpointWebMvcAutoConfiguration.class,
+ ManagementServerPropertiesAutoConfiguration.class,
+ PropertyPlaceholderAutoConfiguration.class);
+ TestUtils.addEnviroment(this.context, "security.basic.enabled:false");
+ this.context.refresh();
+ // Just the management endpoints (one filter) and ignores now
+ assertEquals(7, this.context.getBean(FilterChainProxy.class).getFilterChains()
+ .size());
+ }
+
+ @Test
+ public void testOverrideAuthenticationManager() throws Exception {
+ this.context = new AnnotationConfigWebApplicationContext();
+ this.context.setServletContext(new MockServletContext());
+ this.context.register(TestConfiguration.class,
+
+ SecurityAutoConfiguration.class, ManagementSecurityAutoConfiguration.class,
+ EndpointAutoConfiguration.class,
+ ManagementServerPropertiesAutoConfiguration.class,
+ PropertyPlaceholderAutoConfiguration.class);
+ this.context.refresh();
+ assertEquals(this.context.getBean(TestConfiguration.class).authenticationManager,
+ this.context.getBean(AuthenticationManager.class));
+ }
+
+ private static AnnotationConfigWebApplicationContext debugRefresh(
+ AnnotationConfigWebApplicationContext context) {
+ TestUtils.addEnviroment(context, "debug:true");
+ LoggingApplicationContextInitializer logging = new LoggingApplicationContextInitializer();
+ logging.initialize(context);
+ AutoConfigurationReportLoggingInitializer initializer = new AutoConfigurationReportLoggingInitializer();
+ initializer.initialize(context);
+ context.refresh();
+ initializer.onApplicationEvent(new ContextRefreshedEvent(context));
+ return context;
+ }
+
+ @Configuration
+ protected static class TestConfiguration {
+
+ private AuthenticationManager authenticationManager;
+
+ @Bean
+ public AuthenticationManager myAuthenticationManager() {
+ this.authenticationManager = new AuthenticationManager() {
+
+ @Override
+ public Authentication authenticate(Authentication authentication)
+ throws AuthenticationException {
+ return new TestingAuthenticationToken("foo", "bar");
+ }
+ };
+ return this.authenticationManager;
+ }
+
+ }
+
+}
diff --git a/spring-boot-autoconfigure/pom.xml b/spring-boot-autoconfigure/pom.xml
index 6ec743b3506..72904f87364 100644
--- a/spring-boot-autoconfigure/pom.xml
+++ b/spring-boot-autoconfigure/pom.xml
@@ -126,6 +126,16 @@
spring-security-acltrue
+
+ org.springframework.security
+ spring-security-web
+ true
+
+
+ org.springframework.security
+ spring-security-config
+ true
+ org.springframework.amqpspring-rabbit
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
new file mode 100644
index 00000000000..fab39e5372f
--- /dev/null
+++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/AuthenticationManagerConfiguration.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2012-2013 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.boot.autoconfigure.security;
+
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.security.SecurityProperties.User;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.ObjectPostProcessor;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.authentication.configurers.provisioning.InMemoryUserDetailsManagerConfigurer;
+
+@Configuration
+public class AuthenticationManagerConfiguration {
+
+ private static Log logger = LogFactory
+ .getLog(AuthenticationManagerConfiguration.class);
+
+ @Autowired
+ private SecurityProperties security;
+
+ @Autowired
+ private List dependencies;
+
+ @Bean
+ public AuthenticationManager authenticationManager(
+ ObjectPostProcessor