2014-02-22 37 views
3

我正在使用Spring Security 3.2和CSRF。我的配置包括這樣的:如何在使用CSRF登錄後啓用Spring Security POST重定向?

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

當用戶執行一個POST形式提交(用CSRF令牌)需要驗證,他將被重定向到登錄頁面。之後,Spring Security不再提交請求,而是將用戶重定向到defaultPage

我懷疑的問題是,CSRF令牌獲取日誌時重置。

我怎樣才能獲得日誌後這樣的POST重定向的工作?

更新:我試圖創建一個自定義SavedRequestAwareAuthenticationSuccessHandler重定向到原來的POST請求。但是,我看到原始請求甚至沒有保存在requestCache中。

+1

我很想聽聽你對這個答案。要麼是如何用Spring Security來實現它的解釋,要麼是解釋它本質上是不安全的,因此Spring Security不應該/不能做到這一點。 – Blaine

回答

-1

我可能不明白的東西......但不能從你的配置中刪除default-target-url?

+0

如果您未指定目標網址,Spring Security將重定向到域「/」的根目錄,而不是提交以前的請求。啓用/使用CSRF保護時會發生此問題。它不會發生GET請求(沒有CSRF令牌)。 –

1

看起來,當啓用CSRF保護時,如果請求使用GET方法,Spring Security只會將您的原始請求置於requestCache中。爲了讓它緩存POST請求,我創建了一個自定義requestCache

我不是100%確信這樣做不會以某種方式削弱CSRF保護,但在我看來這似乎是安全的。

增加請求緩存豆的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要求,現在應該緩存和重新在被登錄表單中斷後顯示。

+0

請注意,您可能並不總是希望將POST保存到請求緩存,因爲這可能會導致這裏描述的問題:http://stackoverflow.com/questions/4854480/disable-springsecuritys-savedrequest-storing-logic。我正在研究使用此「AlwaysSaveRequestCache」的變體,該變體僅允許保存POST請求URL的白名單(除了默認的請求匹配程序行爲)。 – sdoxsee

0

這是因爲HttpSessionRequestCache和DefaultSavedRequest沒有設計用於「multipart/form-data」。多部分請求被視爲常規請求,並且所有表單數據都將丟失。從SavedRequest恢復的請求將僅包含URL和方法。

0

它是在隱藏它不會工作的形式相當simple.Don't通CSRF令牌傳遞CSRF token直接作爲query paramsURL像下面

<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> 
相關問題