Spring Boot安全性:禁用安全性

130

当我在一个Spring Boot项目中使用security.basic.enabled=false来禁用安全性,并且该项目具有以下依赖项时:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

我看到了以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.actuate.autoconfigure.ManagementSecurityAutoConfiguration$ManagementWebSecurityConfigurerAdapter': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.setObjectPostProcessor(org.springframework.security.config.annotation.ObjectPostProcessor); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.security.config.annotation.ObjectPostProcessor] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
为了解决这个异常,我不得不添加属性-management.security.enabled=false。我的理解是,当actuator在类路径中时,security.basic.enabled=falsemanagement.security.enabled=false都应该设置为禁用安全性。
请问有人能告诉我我的理解是否正确?

1
如果您只想禁用所有内容,为什么需要在classpath上启用安全性呢?无论如何,由于堆栈跟踪不完整,因此无法知道阻止应用程序启动的原因是什么。我希望它能够启动,但执行器端点应保持安全状态,直到您明确开放它们。 - Dave Syer
@DaveSyer 我想暂时禁用安全性,并且我的应用程序代码引用了安全性库来工作。 - Stackee007
你还没有发布足够的信息来查看应用程序为什么无法启动。完整的堆栈跟踪将是一个开始。 - Dave Syer
2
@DaveSyer的一种原因可能是微服务管理spring-sec-oauth2 ClientDetails。您将具有spring-security的传递导入,但可能不希望在服务中使用基本身份验证。 - Dirk Lachowski
28个回答

120

如果您的软件包中有 spring-boot-actuator,请添加以下内容

@EnableAutoConfiguration(exclude = {
        org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration.class,
        org.springframework.boot.actuate.autoconfigure.ManagementWebSecurityAutoConfiguration.class})

在旧版本的Spring Boot中,该类被称为ManagementSecurityAutoConfiguration

而在新版本中,这已经更改为:

@SpringBootApplication(exclude = {
        org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
        org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class}
        )

更新

如果您的响应式应用程序遇到相同的问题,您可以排除以下类:

@SpringBootApplication(exclude = {ReactiveSecurityAutoConfiguration.class, ReactiveManagementWebSecurityAutoConfiguration.class })

2
还需要排除两个自动配置: SecurityFilterAutoConfiguration.class 和 SecurityRequestMatcherProviderAutoConfiguration.class。 - Eugene Maysyuk
谢谢你提供的新版本。在找到你的答案之前,我浪费了一个小时的时间 :) - Turkdogan Tasdelen
排除ManagementWebSecurityAutoConfiguration是什么意思?排除SecurityAutoConfiguration似乎已经从我的应用中移除了登录提示,这正是我想要的。我正在使用Spring Boot 3。 - Michael Rivera
不自动配置登录页面。Spring与明智的默认设置配合使用...所以如果您没有配置任何内容,它会选择默认设置,假设您需要这样的设置。这只是说什么都不做,然后您可以自由地配置您想要的内容。 - Varesh

87

创建一个名为 application-dev.properties 的文件,并将以下内容添加进去,这种方法似乎也有效:

security.basic.enabled=false
management.security.enabled=false

如果您使用dev配置文件启动Spring Boot应用程序,则无需登录。


1
如果您使用 management.security.enabled=false 禁用了安全性,则不需要 security.basic.enabled=false。 - hennr
我还添加了 security.ignored=/** 然后就可以工作了。 - mojtab23
23
这已经被废弃了! - Eagle_Eye
7
确实。请参考 https://spring.io/blog/2017/09/15/security-changes-in-spring-boot-2-0-m4 了解Spring Boot 2中已弃用的内容的更多信息。 - Wim Deblauwe

62

对于Spring Boot 2,以下属性在application.yml配置中已被废弃:

  security.basic.enabled: false
  management.security.enabled: false

要禁用Spring Boot 2基本版+执行器安全的安全性,可以在application.yml文件中使用以下属性来代替基于注释的排除 (@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class}))

  spring:
    autoconfigure:
      exclude[0]: org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
      exclude[1]: org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration

对于 application.properties,语法应该是这样的

spring.autoconfigure.exclude[0]=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration

谢谢!我暂时使用了一个环境变量将它应用到了一个在Docker容器中运行的SpringBoot 2+应用程序上:SPRING_APPLICATION_JSON='{"spring":{"autoconfigure":{"exclude[0]":"org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration","exclude[1]":"org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration"}}}' - dlamblin
还需要排除两个自动配置:SecurityFilterAutoConfiguration.class和SecurityRequestMatcherProviderAutoConfiguration.class。 - Eugene Maysyuk
@dlamblin 我尝试了你的代码片段,但是我得到了一个错误:java.lang.IllegalArgumentException: 无法解析JSON。有什么想法吗? - Metafaniel
仍然收到授权错误?可能的原因是什么? - Pranali Rasal

43
如果你需要将security作为依赖项,但又不想让Spring Boot为你配置它,你可以使用以下排除项:

如果您需要安全性作为依赖项,但不希望Spring Boot为您进行配置,您可以使用此排除项:

    @EnableAutoConfiguration(exclude = { 
        org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration.class 
    })

还需要排除两个自动配置:SecurityFilterAutoConfiguration.class和SecurityRequestMatcherProviderAutoConfiguration.class。 - Eugene Maysyuk

29

对于使用Spring Boot 2的用户,必须执行以下操作:

@EnableAutoConfiguration(exclude = {
    org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
})

1
Spring Boot 2.0中的ManagementWebSecurityAutoConfiguration发生了什么? - VIJ
1
你可能仍然需要对 @EnableWebSecurity 注解进行注释。 - Victor Petit
2
还需要排除两个自动配置:SecurityFilterAutoConfiguration.class和SecurityRequestMatcherProviderAutoConfiguration.class。 - Eugene Maysyuk
@EugeneMaysyuk "SecurityRequestMatcherProviderAutoConfiguration" <- 我找不到这个! - SGuru
@SGuru 让我来看一下。 - Eugene Maysyuk
@SGuru,你使用的Spring Boot版本是多少?这些类可能有不同的名称。这取决于Spring Boot的版本。 - Eugene Maysyuk

13

1
不幸的是,这个方法行不通。一旦我启动spring-boot,它就会创建默认的安全过滤器链:2020-11-29 18:48:58.095 INFO 30744 --- [ restartedMain] o.s.s.web.DefaultSecurityFilterChain : 创建过滤器链:任何请求,[org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@7c9e4dd,org.springframework.security.web.context.SecurityContextPersistenceFilter@1d14d528, org.springframework.security.web.header.HeaderWriterFilter@3fc159ad, org.springframework.security.web.csrf.CsrfFilter@71b72226,org.springframework.security.... - Ville Miekk-oja
这对我有用,我正在使用Spring Boot 1.7.4。我不需要注释掉@EnableWebSecurity - wonsuc

11
将以下类添加到您的代码中
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * @author vaquar khan
 */
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests().antMatchers("/**").permitAll().anyRequest().authenticated().and().csrf().disable();
    }

}

在application.properties文件中添加以下内容:

security.ignored=/**
security.basic.enabled=false
management.security.enabled=false

8

解决方法是在WebSecurityConfigurerAdapter中允许所有请求,如下所示。

您可以在现有类或新类中执行此操作。

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().permitAll();
    }

请注意:如果已经存在GlobalMethodSecurityConfiguration类,则必须将其禁用。

没有起作用。但是这个对我有用:https://dev59.com/y2Ag5IYBdhLWcg3wLYaI - Ravi MCA
嗨Ravi,根据你的解决方案,在生产环境中不建议使用“http.csrf.disable()”禁用csrf。你是否遇到了POST等调用的CSRF问题? - U_R_Naveen UR_Naveen
@U_R_NaveenUR_Naveen 我写了相同的代码片段,但它不起作用。当我运行Spring Boot应用时,登录页面仍然出现。我该如何修复它? - S.N

6
如果您在测试类中使用@WebMvcTest注释
@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class })
@TestPropertySource(properties = {"spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration"})

这并没有帮助你。

你可以在这里禁用安全性。

@WebMvcTest(secure = false)

5

在不需要依赖项或者代码更改的情况下,使用Spring Boot 2的最简单方法就是:

spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration

2
这在Spring Boot v2.2.2.RELEASE上无法工作。 - PAA
请将此代码放在哪里会更有帮助... - JesseBoyd
1
这在SpringBoot 2.7.5版本中有效。谢谢。 - Dark Star1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接