我正在构建一个由外部系统进行身份验证的应用程序。对于CSRF处理,我想使用Spring Security的CSRF支持(http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html)
我尝试了各种选项,但未经身份验证就无法使用Spring Security的CSRF支持。
是否可以仅使用Spring Security的CSRF支持? (我不想使用身份验证/授权)
答案 0 :(得分:0)
我也有与您相同的要求,并且可以通过 spring-security.xml
中的最少配置来实现此要求<authentication-manager />
<http create-session="never" use-expressions="true">
<csrf />
<http-basic />
</http>
此处
此后,在 web.xml 文件上添加Spring Security Filter。这样可以确保所有请求在通过应用程序控制器处理之前先通过spring安全机制。
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
然后在您的JSP(最好是Header JSP)中,包含Spring Security的Taglib,以在meta标签中访问和存储CSRF令牌。
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>
<sec:csrfMetaTags />
<script type="text/javascript">
var csrfHeader = $("meta[name='_csrf_header']").attr("content");
var csrfToken = $("meta[name='_csrf']").attr("content");
</script>
在此之后,在所有Ajax调用中都包含CSRF令牌。如果未包括在内,您将收到403-访问被拒绝错误。
例如,如果您使用jQuery进行ajax调用,则可以将其全局配置为在请求标题中包含CSRF令牌。
$(document).ajaxSend(function(e, xhr, options) {
xhr.setRequestHeader(csrfHeader, csrfToken);
});
要执行此操作所需的JAR文件为:
spring-security-acl-5.0.7.RELEASE.jar
spring-security-config-5.0.7.RELEASE.jar
spring-security-core-5.0.7.RELEASE.jar
spring-security-taglibs-5.0.7.RELEASE.jar
spring-security-web-5.0.7.RELEASE.jar