【问题标题】:Spring security for CSRFCSRF 的 Spring 安全性
【发布时间】:2015-04-12 08:01:17
【问题描述】:

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

【问题讨论】:

标签: spring-security csrf spring-4


【解决方案1】:

我也有和你一样的需求,通过spring-security.xml

中的最小配置就能实现
<authentication-manager />
<http create-session="never" use-expressions="true">
    <csrf />
    <http-basic />
</http>

这里的声明spring security不期望认证/授权机制,并假设应用程序内的所有URL都已经过认证。

之后,在您的 web.xml 文件中添加 Spring 安全过滤器。这确保了所有请求在被应用控制器处理之前首先通过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 以在元标记中访问和存储 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

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 2021-09-12
    • 1970-01-01
    • 2017-10-27
    • 2021-12-24
    • 2016-03-15
    • 1970-01-01
    • 2019-11-04
    • 2015-11-25
    相关资源
    最近更新 更多