Spring Security,无状态REST服务和CSRF

时间:2018-02-26 09:36:40

标签: java rest spring-boot spring-security csrf

我有一个REST服务,使用Java,Spring-boot和Spring Security with Basic Access Authentication构建。没有视图,没有JSP等,没有“登录”,只有无状态服务可以从单独托管的React应用程序中调用。

我已经阅读了有关CSRF保护的各种文档,但无法决定是否应该使用spring-security CSRF配置,或者只是禁用它?如果我禁用csrf保护,我可以使用我的基本身份验证调用curl服务,如下所示:

curl -H "authorization:Basic c35sdfsdfjpzYzB0dDFzaHA=" -H "content-type:application/json" -d '{"username":"user","password":"password","roles":"USER"}' localhost:8081/api/v1/user

如果我启用了csrf保护并提供了x-csrf-token标头,那么spring CsrfFilter会尝试与HttpServletRequest中的会话cookie中的值(我认为)交叉检查。但是,由于它是无状态的REST服务,我没有会话,并且没有“登录”。

我有一个如下所示的配置类:

@EnableWebSecurity
@Configuration
public class ServiceSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().fullyAuthenticated()
                .and().httpBasic();
        if (!serviceProperties.isCsrfEnabled()) {
            http.csrf().disable();
        }
    }

我想的越多,我就越需要禁用CSRF保护。有没有其他方法来配置弹簧安全性,以便它可以工作?

感谢

2 个答案:

答案 0 :(得分:2)

要回答您的第一个问题,在您描述的上下文中,您不需要CSRF保护。 CSRF保护的背景是确保用户不会被欺骗做一些不需要的操作。

例如,在纯理论中,您可以登录银行的网站(从而建立会话)然后去一些阴暗的网站。该站点可以有一个表单向银行的API发出POST请求。因为那里有会话,如果端点不受CSRF保护,则请求可以通过。

因此,CSRF主要用于防止基于浏览器+会话的攻击。如果您公开纯REST API,例如OAuth保护,然后我没有看到CSRF的任何原因。

使用spring boot时,您还可以使用application.properties / application.yaml配置文件禁用CSRF。

security.enable-csrf=false

您可以查看Common Application Properties文档页面,了解更多开箱即用的配置选项。

答案 1 :(得分:0)

如果要以更合适的方式禁用csrf,可以像这样调用它(如果使用java配置)

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .anyRequest().fullyAuthenticated()
            .and().httpBasic();
       .and()
            .csrf()
            .disable()