我有一个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 {}