我正在使用带有CSRF的Spring Security 3.2。我的配置包括:
<csrf />
<form-login default-target-url="/defaultPage"/>
当用户执行需要身份验证的POST表单提交(带有CSRF令牌)时,他将被重定向到登录页面。之后,不是提交请求,而是由Spring Security将用户重定向到defaultPage
。
我怀疑问题是登录期间CSRF令牌会被重置。
登录后如何才能获得这样的POST重定向?
更新:我尝试创建自定义SavedRequestAwareAuthenticationSuccessHandler
以重定向到原始POST请求。但是,我发现原始请求甚至没有保存在requestCache
。
答案 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吗?