【问题标题】:Spring boot Security Disable securitySpring Boot Security 禁用安全性
【发布时间】:2014-07-16 15:17:39
【问题描述】:

当我使用 security.basic.enabled=false 禁用具有以下依赖项的 Spring Boot 项目的安全性时:

    <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: {}

为了修复这个异常,我必须添加属性 - ma​​nagement.security.enabled=false。我的理解是,当执行器在类路径中时,security.basic.enabled=falsema​​nagement.security.enabled=false 都应该设置为禁用安全性。

如果我的理解有误,有人可以告诉我吗?

【问题讨论】:

  • 如果您只想禁用所有内容,为什么还需要对类路径进行安全保护?无论如何,您的堆栈跟踪是不完整的,因此无法知道是什么阻止了应用程序启动。我希望它会启动,但执行器端点应该保持安全,直到您明确打开它们。
  • @DaveSyer 我想暂时禁用安全性,而且我的应用程序代码引用了安全 jar 来工作。
  • 您还没有发布足够的信息来了解应用程序无法启动的原因。完整的堆栈跟踪将是一个开始。
  • @DaveSyer 一个原因是管理 spring-sec-oauth2 ClientDetails 的微服务。您将拥有 spring-security 的传递导入,但可能不希望在您的服务中使用基本身份验证。

标签: spring-security spring-boot


【解决方案1】:

如果你的包中有 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 })

【讨论】:

  • 另外两个需要排除的自动配置:SecurityFilterAutoConfiguration.class、SecurityRequestMatcherProviderAutoConfiguration.class
  • 感谢新版本一。我已经失去了一个小时,直到我找到你的答案:)
【解决方案2】:

似乎也可以正常工作的是创建一个文件application-dev.properties,其中包含:

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

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

【讨论】:

  • 如果您使用 management.security.enabled=false 禁用安全性,则不需要 security.basic.enabled=false
  • 我还添加了security.ignored=/** 然后工作了。 stackoverflow.com/a/36280413/3291867
  • 现在已弃用!
  • 确实如此。有关 Spring Boot 2 中发生的弃用的更多信息,请参阅 spring.io/blog/2017/09/15/…
【解决方案3】:

对于 Spring Boot 2 以下属性在 application.yml 配置中已弃用

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

要禁用 Sprint Boot 2 Basic + Actuator Security 的安全性,可以在 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"}}}'
  • 另外两个需要排除的自动配置:SecurityFilterAutoConfiguration.class、SecurityRequestMatcherProviderAutoConfiguration.class
【解决方案4】:

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

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

【讨论】:

  • 另外两个需要排除的自动配置:SecurityFilterAutoConfiguration.class、SecurityRequestMatcherProviderAutoConfiguration.class
【解决方案5】:

对于 spring boot 2 用户,它必须是

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

【讨论】:

  • Spring Boot 2.0 中 ManagementWebSecurityAutoConfiguration 发生了什么
  • 您可能仍需要评论您的@EnableWebSecurity 注释
  • 另外两个需要排除的自动配置:SecurityFilterAutoConfiguration.class、SecurityRequestMatcherProviderAutoConfiguration.class
【解决方案6】:

第 1 步:在您的安全配置中注释 @EnableWebSecurity 注释

//@EnableWebSecurity

第 2 步:将其添加到您的 application.properties 文件中。

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

更多详情请看这里:http://codelocation.com/how-to-turn-on-and-off-spring-security-in-spring-boot-application/

【讨论】:

  • 很遗憾,这不起作用。一旦我启动 spring-boot,它将创建默认的安全过滤器链:2020-11-29 18:48:58.095 INFO 30744 --- [restartedMain] ossweb.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....
  • 这对我有用,我使用的是 Spring Boot 1.7.4。我不需要评论@EnableWebSecurity
【解决方案7】:

答案是允许 WebSecurityConfigurerAdapter 中的所有请求,如下所示。

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

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

请注意:如果已经存在 GlobalMethodSecurityConfiguration 类,您必须禁用它。

【讨论】:

  • 没用。但这对我有用stackoverflow.com/questions/23894010/…
  • 嗨 ravi,根据您的解决方案,不建议在生产中将 csrf 禁用为“http.csrf.disable()”。您是否收到 POST 等调用的 CSRF 问题?
  • @U_R_NaveenUR_Naveen 我写了同样的代码 sn-p 但它没有用。当我运行 spring boot 应用程序时,登录页面仍然出现。我该如何解决?
【解决方案8】:

将以下类添加到您的代码中

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();
    }

}

以及应用程序.properties的insie添加

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

【讨论】:

  • 这个解决方案对我有用!!谢谢@vauar khan
【解决方案9】:

如果您在测试类中使用@WebMvcTest 注释

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class })
@TestPropertySource(properties = {"spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration"})

对你没有帮助。

您可以在此处禁用安全性

@WebMvcTest(secure = false)

【讨论】:

    【解决方案10】:

    使用 antMatchers("/") 允许访问所有内容

         protected void configure(HttpSecurity http) throws Exception {
                System.out.println("configure");
                        http.csrf().disable();
                        http.authorizeRequests().antMatchers("/").permitAll();
            }
    

    【讨论】:

    • 这个问题是,访问和安全不是一回事。您可能可以允许访问所有内容,但这不会关闭安全性。例如,仍然会捕获恶意字符串。
    【解决方案11】:

    我只是在application.properties 中添加了security.ignored=/**,这就是魅力所在。

    【讨论】:

    • 这意味着自动安全机制仍然存在,但只是忽略了所有路径。我不愿意保留不需要的东西
    【解决方案12】:

    唯一对我有用的东西:

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

    security.ignored=/**
    

    可能是属性部分是多余的,或者可以在代码中完成,但没有时间进行实验。总之是暂时的。

    【讨论】:

      【解决方案13】:

      Spring Boot 2 无需依赖或代码更改的最简单方法就是:

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

      【讨论】:

      • 这不适用于 Spring Boot v2.2.2.RELEASE
      【解决方案14】:

      您需要将此条目添加到 application.properties 以绕过 Springboot 默认安全

      spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration

      那么就不会有任何认证框了。 otrws,凭据是:- user99b962fa-1848-4201-ae67-580bdeae87e9 (密码随机生成)

      Note: my springBootVersion = '1.5.14.RELEASE'

      【讨论】:

      • 没有这个,security.basic.enabled=false management.security.enabled=false security.ignored=/**不够正常吗?
      【解决方案15】:

      您可以通过以下 2 个步骤在您的项目中配置切换 spring 安全性

      第 1 步: 在 SecurityConfig 类的顶部添加 @ConditionalOnProperty 注释。参考如下:

      @Configuration
      @EnableWebSecurity
      @EnableGlobalMethodSecurity (prePostEnabled = true)
      @ConditionalOnProperty (name = "myproject.security.enabled", havingValue = "true", matchIfMissing = true)
      public class SecurityConfig extends WebSecurityConfigurerAdapter {
         // your security config
      }
      

      第 2 步: 将以下配置添加到您的 application.propertiesapplication.yml 文件中。

      application.properties

      security.ignored=/**
      myproject.security.enabled=false
      

      application.yml

      security:
        ignored: /**
      
      myproject:
        security:
          enabled: false
      

      【讨论】:

      • 是否可以只使用一个属性?
      • @wakedeer 你的评论似乎很神秘,你能详细说明一下吗?
      • 我的意思是 security.ignored=/** 是没有必要的
      【解决方案16】:

      为了避免安全性,您可以使用注释。 在配置类之上使用这个注解:

      @EnableWebSecurity
      

      例如:

      @EnableWebSecurity
      @Configuration
      public class AuthFilter{
         // configured method 
      }
      

      【讨论】:

      • 为什么@EnableWebSecurity 应该禁用网络安全?
      • 至少,它禁用了 Spring Boot 中的默认安全配置
      【解决方案17】:

      将以下行添加到您的主应用程序中。

      如果您不使用 activiti,请删除 org.activiti.spring.boot.SecurityAutoConfiguration.class。

      同样,如果您不使用 spring-boot-actuator,请移除执行器的那个。

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

      【讨论】:

        【解决方案18】:

        正如前面提到的通过评论禁用安全性的多个解决方案

        @EnableWebSecurity

        annotation 和 other 是通过 application.properties 或 yml 中的属性。但这些属性在最新的 Spring Boot 版本中显示为已弃用。

        所以,我想分享另一种在您的 application-dev.propertiesapplication-dev.yml 中配置默认​​用户名和密码并使用它们登录的方法在开发环境中进入 swagger 等。

        spring.security.user.name=admin
        spring.security.user.password=admin
        

        因此,这种方法还将为您提供某种安全性,并且您可以与您的开发团队共享此信息。您也可以配置用户角色,但在开发级别不需要。

        【讨论】:

          【解决方案19】:

          使用 Gradle 和 Spring boot v2.4.4,您可以通过在 build.gradle 中添加此配置来完全排除 spring 安全性

          configurations.all {
              exclude group:"org.springframework.boot", module: "spring-boot-starter-security"
          }
          

          【讨论】:

            【解决方案20】:

            我在 application.yml 中添加了以下设置并且工作正常。

            security:
                route-patterns-to-be-skipped:
                  - /**/*
            

            这可以转换为security.route-paterns-to-be-skipped=/**/* for application.properties

            【讨论】:

            • 这个属性根本不存在。
            猜你喜欢
            • 2018-09-13
            • 2018-11-22
            • 2015-09-23
            • 2020-06-11
            • 2016-05-03
            • 2016-01-02
            • 2019-12-28
            • 2018-04-26
            相关资源
            最近更新 更多