我有一个Sping Boot REST API。由于安全策略的原因,我需要为浏览器访问的端点启用CSRF保护。但是,非浏览器也可以访问此API。有没有方法可以创建两组端点,一组端点只能在启用CSRF的情况下由浏览器访问,另一组端点只能在禁用CSRF的情况下由非浏览器访问?
yfwxisqw1#
当您使用DSL配置CSRF保护时,例如http.csrf()...,您可以通过传递RequestMatcher来确定您希望应用CSRF保护的请求,如下所示:
http.csrf()...
RequestMatcher
http.csrf(csrf -> csrf.requireCsrfProtectionMatcher(new MyBrowserRequestMatcher()));
您的RequestMatcher实现可以验证HttpServletRequest是否包含X-Requested-With: XMLHttpRequest头或检查User-Agent。请记住,标头可以更改,您无法保证请求实际上来自浏览器或非浏览器应用程序。
HttpServletRequest
X-Requested-With: XMLHttpRequest
User-Agent
xkftehaa2#
我认为您可以为浏览器请求和API请求使用单独的URL基础。例如,您可以在/api/...下设置所有非浏览器要查询的端点,并且在SpringBootSecurityConfiguration类和configure(HttpSecurity http)方法中,如果模式匹配,您可以有条件地使用http.csrf().disable();禁用CSRF(可以在此处找到很棒的教程)编辑:这里是另一个可能有用的answer。
/api/...
SpringBootSecurityConfiguration
configure(HttpSecurity http)
http.csrf().disable();
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 {}
3条答案
按热度按时间yfwxisqw1#
当您使用DSL配置CSRF保护时,例如
http.csrf()...
,您可以通过传递RequestMatcher
来确定您希望应用CSRF保护的请求,如下所示:您的
RequestMatcher
实现可以验证HttpServletRequest
是否包含X-Requested-With: XMLHttpRequest
头或检查User-Agent
。请记住,标头可以更改,您无法保证请求实际上来自浏览器或非浏览器应用程序。
xkftehaa2#
我认为您可以为浏览器请求和API请求使用单独的URL基础。
例如,您可以在
/api/...
下设置所有非浏览器要查询的端点,并且在SpringBootSecurityConfiguration
类和configure(HttpSecurity http)
方法中,如果模式匹配,您可以有条件地使用http.csrf().disable();
禁用CSRF(可以在此处找到很棒的教程)编辑:这里是另一个可能有用的answer。
nxagd54h3#
正如@ferrouskid所说,我创建了两个URL,一个用于浏览器,另一个用于非浏览器:
在Spring安全配置中:
在控制器中: