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

qyyhg6bp  于 2022-11-11  发布在  Spring
关注(0)|答案(3)|浏览(139)

我有一个Sping Boot REST API。由于安全策略的原因,我需要为浏览器访问的端点启用CSRF保护。但是,非浏览器也可以访问此API。有没有方法可以创建两组端点,一组端点只能在启用CSRF的情况下由浏览器访问,另一组端点只能在禁用CSRF的情况下由非浏览器访问?

yfwxisqw

yfwxisqw1#

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

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

您的RequestMatcher实现可以验证HttpServletRequest是否包含X-Requested-With: XMLHttpRequest头或检查User-Agent
请记住,标头可以更改,您无法保证请求实际上来自浏览器或非浏览器应用程序。

xkftehaa

xkftehaa2#

我认为您可以为浏览器请求和API请求使用单独的URL基础。
例如,您可以在/api/...下设置所有非浏览器要查询的端点,并且在SpringBootSecurityConfiguration类和configure(HttpSecurity http)方法中,如果模式匹配,您可以有条件地使用http.csrf().disable();禁用CSRF(可以在此处找到很棒的教程)
编辑:这里是另一个可能有用的answer

nxagd54h

nxagd54h3#

正如@ferrouskid所说,我创建了两个URL,一个用于浏览器,另一个用于非浏览器:
在Spring安全配置中:

@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 {}

相关问题