Spring Security:按客户端类型(浏览器/非浏览器)启用/禁用CSRF

2022-09-02 01:51:49

Spring Security文档

“当您使用CSRF保护时?我们的建议是对普通用户可能由浏览器处理的任何请求使用CSRF保护。如果您只是创建由非浏览器客户端使用的服务,则可能需要禁用CSRF保护。


如果我的服务将被“浏览器”和“非浏览器”客户端(如第三方外部服务)使用,那么Spring Security是否提供了一种专门为某些类型的客户端禁用CSRF的方法?


答案 1

我确信有一种方法可以在Spring Security XML中做到这一点,但是由于我使用的是Java Config,这是我的解决方案。

 @Configuration
 @EnableWebSecurity
 public class SecurityConfig {

    @Configuration
    @Order(1)
    public static class SoapApiConfigurationAdapter extends WebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {
            http
                .antMatcher("/soap/**")
                .csrf().disable()
                .httpBasic();
        }
    }


    @Configuration
    public static class WebApiConfigurationAdapter extends WebSecurityConfigurerAdapter {

        protected void configure(HttpSecurity http) throws Exception {
            http        
                .formLogin()
                    .loginProcessingUrl("/authentication")
                    .usernameParameter("j_username")
                    .passwordParameter("j_password").permitAll()
                    .and()
                .csrf().disable()

        }
     }
}

答案 2

恕我直言,没有什么是开箱即用的。在你的情况下,我会做的是,例如,有一个URL的层次结构,植根于该层次结构将免除csrf。它易于配置。在 XML 配置中,您有一个包含 的普通块,只需复制它并像这样修改第一个块/api<http><csrf/>

<http pattern="/api/**">
    ...
    <!-- csrf -->
</http>

因为它是第一个,它将被触发到不使用csrf的任何分层请求,所有其他请求都将使用它。/api

在应用程序的正常部分中,您永远不会使用 url,而是将其保留给非浏览器用法。/api/**

然后在控制器中,将它们映射到其正常 URL 和以下位置的副本:/api

@Controller
@RequestMapping({ "/rootcontrollerurl", "/api/rootcontrollerurl"})
class XController {
    @RequestMapping(value = "/request_part_url", ...)
    public ModelAndView method() {
        ...
    }
}

(当然,可能是空白的...)rootcontrollerurlrequest_part_url

但是,您必须分析允许非 csrf 控制的请求的安全隐患,并最终从层次结构中排除控制器。/api


推荐