【发布时间】:2014-04-26 19:06:45
【问题描述】:
使用 Spring security 3.2 在我的 Spring MVC 应用程序中启用 CSRF。
我的 spring-security.xml
<http>
<intercept-url pattern="/**/verify" requires-channel="https"/>
<intercept-url pattern="/**/login*" requires-channel="http"/>
...
...
<csrf />
</http>
尝试为请求 URL 中包含“验证”的请求禁用 CSRF。
MySecurityConfig.java
@Configuration
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
private CsrfMatcher csrfRequestMatcher = new CsrfMatcher();
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().requireCsrfProtectionMatcher(csrfRequestMatcher);
}
class CsrfMatcher implements RequestMatcher {
@Override
public boolean matches(HttpServletRequest request) {
if (request.getRequestURL().indexOf("verify") != -1)
return false;
else if (request.getRequestURL().indexOf("homePage") != -1)
return false;
return true;
}
}
}
Csrf 过滤器验证从“验证”提交的 CSRF 令牌,并在我从 http 向 https 提交请求时抛出无效令牌异常 (403)。在这种情况下如何禁用 csrf 令牌身份验证?
【问题讨论】:
-
在我们尝试解决此问题之前,您为什么要使用 XML 和 JavaConfig?这可能会给您带来诸如我不确定哪个配置优先等问题。您应该选择其中之一。
-
使用 XML 配置将一些 URL 引导至 https,将其他 URL 引导至 http。在 XML 中添加了 CSRF 功能,但是当用户从通过 https 引导的页面提交请求时,我们遇到了问题(无效令牌)。 1. 用户登陆 http 上的页面(主页) 2. 导航到 https 上的页面(验证) 3. 从验证页面提交请求时获取 Invalid Token 异常。所以尝试在验证页面上禁用 CSRF 身份验证。
-
您可以使用 java 配置 http.requiresChannel() 通过 Java 配置启用通道安全性。不要同时使用 XML 和 JavaConfig 使用其中之一。我的猜测是您的 Security Java Configuraiton 没有被 XML 配置拾取或覆盖
-
这是一篇关于如何使用 xml 配置禁用某些 URL 的 CSRF 检查的完整博客:blogs.sourceallies.com/2014/04/… 不幸的是,它似乎不适用于我的 Spring Security 3.2 版本.8.
标签: spring spring-mvc spring-security