Java 如何在使用CSRF登录后启用Spring Security POST重定向?

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的SpringSecurity3.2。我的配置包括:

  <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>&nbsp;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>&nbsp;Save
                            </button>

                        </div>
                        </form:form>