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

时间:2014-02-22 18:04:39

标签: java spring redirect spring-security csrf

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

  <csrf />
  <form-login default-target-url="/defaultPage"/>

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

<bean id="requestCache" class="a.b.c.AlwaysSaveRequestCache" />

<http>
   <csrf />
   <request-cache ref="requestCache" />
</http>

通过扩展和借用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请求现在应在登录表单中断后进行缓存和重新发送。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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