Spring doc说
"当您使用CSRF保护时?我们的建议是对普通用户可以由浏览器处理的任何请求使用CSRF保护。如果您只创建非浏览器客户端使用的服务,则可能需要禁用CSRF保护。"
如果我的服务将被"浏览器"和#34;非浏览器"第三方外部服务等客户端是否提供了一种专门为某类客户端禁用csrf的方法?
参考:http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html
答案 0 :(得分:9)
我确信有一种方法可以在Spring Security XML中执行此操作,但由于我使用的是Java Config,因此这是我的解决方案。
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Configuration
@Order(1)
public static class SoapApiConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/soap/**")
.csrf().disable()
.httpBasic();
}
}
@Configuration
public static class WebApiConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginProcessingUrl("/authentication")
.usernameParameter("j_username")
.passwordParameter("j_password").permitAll()
.and()
.csrf().disable()
}
}
}
答案 1 :(得分:5)
/api
为根,可以免除csrf。它很容易配置。在XML配置中,您有一个包含<http>
的普通<csrf/>
块,您只需将其复制并修改第一个块
<http pattern="/api/**">
...
<!-- csrf -->
</http>
首先,它将在不使用csrf的情况下触发/api
层次结构的任何请求,所有其他请求都将使用它。
在应用程序的正常部分,您永远不会使用/api/**
网址,并将其保留给非浏览器使用。
然后在您的控制器中,您将它们映射到正常网址和/api
下的副本:
@Controller
@RequestMapping({ "/rootcontrollerurl", "/api/rootcontrollerurl"})
class XController {
@RequestMapping(value = "/request_part_url", ...)
public ModelAndView method() {
...
}
}
(当然,rootcontrollerurl
和request_part_url
可能是空白的......)
但是你必须分析允许非csrf控制请求的安全含义,并最终从/api
层次结构中排除控制器。
答案 2 :(得分:1)
以下是我在特定端点上禁用CSRF保护的内容 在appconfig-security.xml上添加一个包含模式信息的节点,如下例所示:
<http security="none" pattern="/sku/*"/>
<http security="none" pattern="/sku/*/*"/>
<http security="none" pattern="/sku"/>
请记住,如果您打算使用地图所有请求,请先使用符号“*”进行排序。