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

我正在使用带有CSRF的Spring Security 3.2。 我的配置包括:

  

当用户执行需要身份validation的POST表单提交(带有CSRF令牌)时,他将被重定向到登录页面。 之后,Spring Security会将用户重定向到defaultPage ,而不是提交请求。

我怀疑问题是在登录期间CSRF令牌被重置。

登录后如何获得这样的POST重定向?

更新 :我尝试创建自定义SavedRequestAwareAuthenticationSuccessHandler以重定向到原始POST请求。 但是,我看到原始请求甚至没有保存在requestCache

似乎启用CSRF保护时,如果请求使用GET方法,Spring Security仅将您的原始请求放入requestCache 。 为了让它也缓存POST请求,我创建了一个自定义的requestCache

我不是100%确信这样做并不会以某种方式削弱CSRF保护,但在我看来这似乎是安全的。

将请求缓存bean添加到XML配置:

      

通过从HttpSessionRequestCache扩展和借用代码来实现自定义请求缓存:

 public class AlwaysSaveRequestCache extends HttpSessionRequestCache { @Override public void saveRequest(HttpServletRequest request, HttpServletResponse response) { final String SAVED_REQUEST = "SPRING_SECURITY_SAVED_REQUEST"; DefaultSavedRequest savedRequest = new DefaultSavedRequest(request, new PortResolverImpl()); request.getSession().setAttribute(SAVED_REQUEST, savedRequest); logger.debug("DefaultSavedRequest added to Session: " + savedRequest); } } 

现在,您的POST请求应在登录表单中断后进行缓存和重新发送。

这很简单。不要以隐藏的forms传递CSRF token直接将CSRF token作为query params传递到URL如下所示

      

这是因为HttpSessionRequestCache和DefaultSavedRequest不能用于“multipart / form-data”。 Multipart请求被视为常规请求,并且所有表单数据都将丢失。 从SavedRequest恢复的请求将仅包含URL和方法。

我可能听不懂……但你不能从配置中删除default-target-url吗?