我也有和你一样的需求,通过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