有没有办法在不使用身份验证和授权等其他功能的情况下使用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>
答案 0 :(得分:0)
正如您已经注意到security="none"
允许您指定要完全禁用Spring Security的URL子集,如:
<http pattern="/css/**" security="none"/>
<http pattern="/login.jsp*" security="none"/>
如果您希望将Spring Security保留为网址,但希望禁用身份验证等,请改为使用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配置以来已经有一段时间了。也许您应该考虑使用Java配置?
答案 1 :(得分: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