使用Spring Security实现CSRF保护

时间:2016-05-06 19:29:47

标签: spring spring-security csrf

有没有办法在不使用身份验证和授权等其他功能的情况下使用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>

2 个答案:

答案 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>

此处声明spring安全性不需要认证/授权机制,并假定所有请求都已通过认证。

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