Java 如何在使用CSRF登录后启用Spring Security POST重定向?
我正在使用带CSRF的SpringSecurity3.2。我的配置包括:Java 如何在使用CSRF登录后启用Spring Security POST重定向?,java,spring,redirect,spring-security,csrf,Java,Spring,Redirect,Spring Security,Csrf,我正在使用带CSRF的SpringSecurity3.2。我的配置包括: <csrf /> <form-login default-target-url="/defaultPage"/> 当用户进行需要身份验证的POST表单提交(使用CSRF令牌)时,他将被重定向到登录页面。之后,Spring Security将用户重定向到defaultPage,而不是提交请求 我怀疑问题在于CSRF令牌在登录期间被重置 如何在登录工作后获得这样的帖子重定向 更新:我试图创
<csrf />
<form-login default-target-url="/defaultPage"/>
当用户进行需要身份验证的POST表单提交(使用CSRF令牌)时,他将被重定向到登录页面。之后,Spring Security将用户重定向到defaultPage
,而不是提交请求
我怀疑问题在于CSRF令牌在登录期间被重置
如何在登录工作后获得这样的帖子重定向
更新:我试图创建一个自定义的
SavedRequestAwareAuthenticationSuccessHandler
,以重定向到原始POST请求。但是,我看到原始请求甚至没有保存在requestCache
中,我可能不明白一些事情。。。但是您不能从配置中删除默认的目标url吗?当启用CSRF保护时,如果请求使用了GET
方法,Spring Security似乎只会将原始请求放在requestCache
中。为了让它缓存POST
请求,我创建了一个自定义requestCache
我不是100%相信这样做不会削弱CSRF的保护,但在我看来它是安全的
将请求缓存bean添加到XML配置:
<bean id="requestCache" class="a.b.c.AlwaysSaveRequestCache" />
<http>
<csrf />
<request-cache ref="requestCache" />
</http>
您的
POST
请求现在应该被缓存,并在被登录表单中断后重新发送。这是因为HttpSessionRequestCache和DefaultSavedRequest不是为处理“多部分/表单数据”而设计的。多部分请求被视为常规请求,所有表单数据都将丢失。从SavedRequest还原的请求将只包含URL和方法。这非常简单。不要以隐藏的形式传递CSRF令牌,否则将无法工作将CSRF令牌作为查询参数直接传递到URL
,如下所示
<c:url value="/jobseeker/resume/uploadJobSeekerResume1?${_csrf.parameterName}=${_csrf.token}" var="uploadResumeURL"/>
<form:form action="${uploadResumeURL}" method="post" enctype="multipart/form-data">
<input id="file" name="file" type="file" />
<div class="modal-footer">
<button type="submit" class="btn btn-success" >
<span class="glyphicon glyphicon-ok-sign"></span> Save
</button>
</div>
</form:form>
拯救
如果未指定目标url,Spring Security将重定向到域“/”的根目录,而不是提交上一个请求。启用/使用CSRF保护时会发生此问题。GET请求不会发生这种情况(没有CSRF令牌)。我很想听到关于这一点的答案。说明如何使用Spring Security实现此功能,或者说明它本身不安全,因此不应该/不能使用Spring Security完成。请注意,您可能并不总是希望将POST保存到请求缓存,因为这可能会导致此处描述的问题:。我正在研究使用这个“AlwaysSaveRequestCache”的变体,它只允许保存POST请求URL的白名单(除了默认的请求匹配器行为)。
<c:url value="/jobseeker/resume/uploadJobSeekerResume1?${_csrf.parameterName}=${_csrf.token}" var="uploadResumeURL"/>
<form:form action="${uploadResumeURL}" method="post" enctype="multipart/form-data">
<input id="file" name="file" type="file" />
<div class="modal-footer">
<button type="submit" class="btn btn-success" >
<span class="glyphicon glyphicon-ok-sign"></span> Save
</button>
</div>
</form:form>