web-dev-qa-db-ja.com

application.propertiesを使用してSpringでcsrfを無効にする方法は?

次のプロパティが存在します。

security.enable-csrf=false

ただし、プロパティをapplication.propertiesに追加すると、csrf保護は引き続きオンになります。

動作するのは、プログラムで無効にすることです。

しかし、私はプロパティ設定を好むでしょう。なぜ機能しないのでしょうか?

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

    }
}
13
membersound

WebSecurityConfigurerAdapterは命令型のアプローチを使用しているため、security.enable-csrf変数の値を挿入し、CSRFがfalseの場合は無効にすることができます。あなたは正しい、私はこれが箱から出して動作するはずだと思います。

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

私がやったことは、devスプリングプロファイルがアクティブになったときにapplication.ymlでその変数をfalseに設定することでしたが、nosecurityそのような目的にも。このプロセスが非常に簡単になります。

--- application.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.2.RELEASEで問題がありましたが、バージョン 1.5.9.RELEASE (バージョン2以前の最新の安定版)既に修正されており、デフォルトではcsrfが無効になっており、security.enable_csrf: trueで有効にできます。したがって、可能な解決策は、バージョン1.5.9.RELEASEにアップグレードするだけで、その後、アーキテクチャが大きく異なる可能性があるメジャーバージョンをバージョン2にアップグレードすることです。

8
EliuX

更新:

Spring-boot 1.xでapplication.propertiesを使用してCSRFを無効にすると問題があるようです(これを開くためのEliuxのおかげで case )。

だから、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");
    }
} 
3
Naor Bar