CSRF的Spring安全性

时间:2015-02-11 19:37:15

标签: spring-security csrf spring-4

我正在构建一个由外部系统进行身份验证的应用程序。对于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支持? (我不想使用身份验证/授权)

1 个答案:

答案 0 :(得分:0)

我也有与您相同的要求,并且可以通过 spring-security.xml

中的最少配置来实现此要求
<authentication-manager />
<http create-session="never" use-expressions="true">
    <csrf />
    <http-basic />
</http>

此处声明spring安全性不期望使用身份验证/授权机制,并假定应用程序内部的所有URL均已通过身份验证。

此后,在 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