Spring security 通过应用 <csrf />
提供了一种 XML 方式来配置 CSRF 保护。标记为<http>
元素配置。
出于开发目的,我想偶尔关闭这种保护。通常我会编辑我的 security-context.xml
文件并更改为 <csrf disabled="true">
.
我尝试使用诸如<csrf disabled="${someProperty:false}" />
之类的表达式但它无效,因为 XML 架构仅接受原始 bool 值。
我不想仅针对有时必须打开/关闭的单个参数使用整个 bean 配置文件(对于整个 <http>
元素)。
有什么建议吗?
其他信息
为了使用 RESTClient 针对经过身份验证的 Controller 执行一些单元测试(当我懒得将 JUnit 与 MockMvc 一起使用时),我都需要绕过表单例份验证(例如使用 <http-basic />
并在凭据上指示 RESTClient)并禁用 CSRF ,否则所有请求都将因缺少 token 而被阻止。
我的应用程序是一个 WAR 应用程序,根据设计,它使用 XML 配置而不是基于代码的配置
最佳答案
使用 request-matcher-ref 并创建您自己的自定义 RequestMatcher。
<csrf token-repository-ref="csrfTokenRepository" request-matcher-ref="csrfRequestMatcher" />
这是 Spring bean 的定义:
<spring:bean class="com.faizalsidek.security.CsrfRequestMatcher" id="csrfRequestMatcher" />
<spring:bean class="org.springframework.security.web.csrf.CookieCsrfTokenRepository" id="csrfTokenRepository" />
这是自定义的 CsrfRequestMatcher:
public class CsrfRequestMatcher implements RequestMatcher {
/**
* Enable CSRF flag.
*/
@Value("${csrf.enabled}")
private boolean csrfEnabled;
@Override
public final boolean matches(final HttpServletRequest request) {
return csrfEnabled;
}
}
关于spring - 通过属性禁用 CSRF 保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33275848/