diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/SecurityAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/SecurityAutoConfiguration.java
index 288627d3d3..b65f1f73b1 100644
--- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/SecurityAutoConfiguration.java
+++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/SecurityAutoConfiguration.java
@@ -17,13 +17,18 @@
package org.springframework.boot.autoconfigure.security;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
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.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
/**
@@ -52,4 +57,23 @@ public class SecurityAutoConfiguration {
return new SecurityProperties();
}
+ /**
+ * If the user explicitly disables the basic security features and forgets to
+ * @EnableWebSecurity, and yet still wants a bean of type
+ * WebSecurityConfigurerAdapter, he is trying to use a custom security setup. The app
+ * would fail in a confusing way without this shim configuration, which just helpfully
+ * defines an empty @EnableWebSecurity.
+ *
+ * @author Dave Syer
+ */
+ @ConditionalOnExpression("!${security.basic.enabled:true}")
+ @ConditionalOnBean(WebSecurityConfigurerAdapter.class)
+ @ConditionalOnClass(EnableWebSecurity.class)
+ @ConditionalOnMissingBean(WebSecurityConfiguration.class)
+ @ConditionalOnWebApplication
+ @EnableWebSecurity
+ protected static class EmptyWebSecurityConfiguration {
+
+ }
+
}
diff --git a/spring-boot-samples/spring-boot-sample-web-secure/src/main/java/sample/ui/secure/SampleSecureApplication.java b/spring-boot-samples/spring-boot-sample-web-secure/src/main/java/sample/ui/secure/SampleWebSecureApplication.java
similarity index 93%
rename from spring-boot-samples/spring-boot-sample-web-secure/src/main/java/sample/ui/secure/SampleSecureApplication.java
rename to spring-boot-samples/spring-boot-sample-web-secure/src/main/java/sample/ui/secure/SampleWebSecureApplication.java
index 92d878d18c..76f9d4f532 100644
--- a/spring-boot-samples/spring-boot-sample-web-secure/src/main/java/sample/ui/secure/SampleSecureApplication.java
+++ b/spring-boot-samples/spring-boot-sample-web-secure/src/main/java/sample/ui/secure/SampleWebSecureApplication.java
@@ -35,7 +35,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
@EnableAutoConfiguration
@ComponentScan
@Controller
-public class SampleSecureApplication extends WebMvcConfigurerAdapter {
+public class SampleWebSecureApplication extends WebMvcConfigurerAdapter {
@RequestMapping("/")
public String home(Map model) {
@@ -52,7 +52,7 @@ public class SampleSecureApplication extends WebMvcConfigurerAdapter {
public static void main(String[] args) throws Exception {
// Set user password to "password" for demo purposes only
- new SpringApplicationBuilder(SampleSecureApplication.class).properties("security.user.password=password").run(
+ new SpringApplicationBuilder(SampleWebSecureApplication.class).properties("security.user.password=password").run(
args);
}
diff --git a/spring-boot-samples/spring-boot-sample-web-secure/src/main/resources/application.properties b/spring-boot-samples/spring-boot-sample-web-secure/src/main/resources/application.properties
index 03e8cdc841..12d9154ea9 100644
--- a/spring-boot-samples/spring-boot-sample-web-secure/src/main/resources/application.properties
+++ b/spring-boot-samples/spring-boot-sample-web-secure/src/main/resources/application.properties
@@ -1,2 +1,3 @@
spring.thymeleaf.cache: false
-debug: true
\ No newline at end of file
+debug: true
+security.basic.enabled: false
\ No newline at end of file
diff --git a/spring-boot-samples/spring-boot-sample-web-secure/src/test/java/sample/ui/secure/SampleSecureApplicationTests.java b/spring-boot-samples/spring-boot-sample-web-secure/src/test/java/sample/ui/secure/SampleSecureApplicationTests.java
index d5b5ba990c..53fdd641f4 100644
--- a/spring-boot-samples/spring-boot-sample-web-secure/src/test/java/sample/ui/secure/SampleSecureApplicationTests.java
+++ b/spring-boot-samples/spring-boot-sample-web-secure/src/test/java/sample/ui/secure/SampleSecureApplicationTests.java
@@ -42,7 +42,7 @@ import static org.junit.Assert.assertTrue;
* @author Dave Syer
*/
@RunWith(SpringJUnit4ClassRunner.class)
-@SpringApplicationConfiguration(classes = SampleSecureApplication.class)
+@SpringApplicationConfiguration(classes = SampleWebSecureApplication.class)
@WebAppConfiguration
@IntegrationTest
@DirtiesContext