[英]CSRF Protection using Spring Security
有没有办法只使用 Spring Security 实现 CSRF 保护而不使用其他功能,例如身份验证和授权?
我尝试了以下配置,但它关闭了 spring-security 的所有功能。 想看看是否有一种方法可以配置以保留 csrf 功能。
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-4.0.xsd">
<http auto-config="true" security="none"/>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="user" password="Password1" authorities="ROLE_USER"/>
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>
正如您已经注意到的, security="none"
允许您指定将完全禁用Spring Security的一部分URL,如:
<http pattern="/css/**" security="none"/>
<http pattern="/login.jsp*" security="none"/>
如果您希望保留Spring Security的URL,但想禁用身份验证等,请使用access="permitAll"
代替:
<http>
<intercept-url pattern="/**" access="permitAll"/>
</http>
我看到您正在使用Spring Security 4,因此默认情况下将启用csrf保护。 如果您使用的是Spring Security 3,则需要自己启用它,如下所示:
<http>
<intercept-url pattern="/**" access="permitAll"/>
<csrf/>
</http>
编辑我已经更新了我的答案。 自从我使用xml config以来已经有一段时间了。 也许您也应该考虑使用Java配置?
我也有与您相同的要求,并且可以通过在spring-security.xml中进行最少的配置来实现此要求。
<authentication-manager />
<http create-session="never" use-expressions="true">
<csrf />
<http-basic />
</http>
在这里,<authentication-manager />声明spring security不期望使用身份验证/授权机制,并假定所有请求都已通过身份验证。
之后,在您的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,以将CSRF令牌访问和存储在meta标签中。
<%@ 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.