Spring Boot REST API - 按客户端类型(浏览器/非浏览器)启用/禁用 CSRF 保护?

Spring Boot REST API - enable / disable CSRF protection by client type (browser / non-browser)?

我有一个 Spring 引导 REST API。由于安全策略,我需要为浏览器访问的端点启用 CSRF 保护。但是,这个 API 也将被非浏览器访问。有没有一种方法可以创建两组端点,一组仅在启用 CSRF 的情况下可由浏览器访问,另一组仅可在禁用 CSRF 的情况下由非浏览器访问?

我认为您可以为浏览器请求和 API 请求分别设置 URL 基础。

例如,您可以在 /api/... 下以及 SpringBootSecurityConfiguration class 和 configure(HttpSecurity http) 中包含要由 non-browsers 查询的所有端点如果模式匹配,您可以使用 http.csrf().disable(); 有条件地禁用 CSRF 的方法(可以找到很棒的教程 here

编辑:这是另一个可能有用的answer

当您使用 DSL 配置 CSRF 保护时,像这样 http.csrf()... 您可以通过传递 RequestMatcher 来判断您希望应用 CSRF 保护的请求,如下所示:

http.csrf(csrf -> csrf.requireCsrfProtectionMatcher(new MyBrowserRequestMatcher()));

并且您的 RequestMatcher 实现可以验证 HttpServletRequest 是否包含 header X-Requested-With: XMLHttpRequest 或检查 User-Agent.

请记住,header 可以更改,您无法保证请求确实来自浏览器或 non-browser 应用程序。