使用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吗?