如何使用 application.properties 在 Spring 中禁用 csrf?

存在以下属性:

security.enable-csrf=false

但是 csrf 保护仍然打开,如果我将属性添加到 。application.properties

有效的方法是以编程方式禁用它。

但我更喜欢属性配置。为什么它不能工作?

@Configuration
public class AuthConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.csrf().disable();

    }
}

答案 1

由于 使用命令式方法,因此您可以注入变量的值,并在 CSRF 为 false 时禁用 CSRF。你是对的,我认为这应该开箱即用。WebSecurityConfigurerAdaptersecurity.enable-csrf

@Configuration
public class AuthConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;

    @Value("${security.enable-csrf}")
    private boolean csrfEnabled;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
    }

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

       if(!csrfEnabled)
       {
         http.csrf().disable();
       }
    }
}

我所做的是在我的应用程序中将该变量设置为false.yml,当我有一个开发弹簧配置文件处于活动状态时,尽管您也可以为此目的创建一个名为nosecurity的配置文件。它大大简化了这个过程:

---应用程序.yml ---

# Production configuration
server:
  port: ${server.web.port}
admin.email: ${admin.email}
#etc
---
spring:
  profiles: dev

security.enable-csrf: false

#other Development configurations

我希望它适合您的需求

2017年12月17日更新

根据Spring Boot成员的评论,此问题已在Spring的新版本上修复:我在版本上有它,但似乎在版本1.5.9.RELEASE(版本2之前的最新稳定版本)中,它已经修复,默认情况下csrf被禁用,可以使用.因此,一个可能的解决方案可能只是升级到版本,然后再将主要版本升级到版本2,其中体系结构可能更加不同。1.5.2.RELEASEsecurity.enable_csrf: true1.5.9.RELEASE


答案 2

更新:

看起来在spring-boot 1.x上使用appplicat.properties禁用CSRF存在问题(感谢Eliux打开此案例)。

因此,我使用嵌入式tomcat的spring-boot 1.5.7解决方案是通过SecurityConfig类禁用CSRF(请注意,通过这种方式我保留了tomcat ootb基本身份验证):

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // Note: 
        // Use this to enable the tomcat basic authentication (tomcat popup rather than spring login page)
        // Note that the CSRf token is disabled for all requests (change it as you wish...)
        http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        // Add here any custom code you need in order to get the credentials from the user...  
        auth.inMemoryAuthentication()
            .withUser("myUserName")
            .password("myPassword")
            .roles("USER");
    }
} 

推荐