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



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

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

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

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

请记住,标头可以更改,并且不能保证请求实际上来自浏览器或非浏览器应用程序。

我认为浏览器请求和API请求可以有单独的URL基础。

例如,您可以在/api/...下拥有非浏览器要查询的所有端点,在您的SpringBootSecurityConfiguration类和configure(HttpSecurity http)方法中,如果模式匹配,您可以有条件地使用http.csrf().disable();禁用CSRF(可以在此处找到很棒的教程(

编辑:这是另一个可能有用的答案。

正如@ferrouskid所说,我创建了两个URL,一个用于浏览器,另一个用于非浏览器:

春季安全配置:

@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.csrf().ignoringAntMatchers("/withoutCsrf/**")
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.and()
.cors().disable();
//complete your configuration }

控制器内:

@Controller
@RequestMapping({"books","withoutCsrf/books"})
public class BookController {}

最新更新