2014-07-14 67 views
0

我已經在我的項目加入安全模塊..
我debuged,發現安全模塊總是重定向到URL =「/」後登錄成功Play框架1.2.5 - 安全重定向問題:請求兩次?

例,在安全類

public class Secure extends Controller { 
@Before(unless={"login", "authenticate", "logout"}) 
static void checkAccess() throws Throwable { 
// ... default code 
// ---------------------------checkpoint (2) 
} 

static void redirectToOriginalURL() throws Throwable { 
     Security.invoke("onAuthenticated"); 
     String url = flash.get("url"); 
     if(url == null) { 
      url = Play.ctxPath + "/"; 
     } 
     System.out.println("DEBUG: redirectToOriginalURL() " + url); 
     redirect("/weekPlan"); // ----------------------- (1) 
    } 
} 

調試順序

  1. 登錄成功後,redirectToOriginalURL()運行第一,然後重定向到 「/ weekPlan」

  2. 的checkAccess()運行,Request的= 「/ weekPlan」

  3. 一切正常運行,但它不重定向到 「/ weekPlan」

  4. 的checkAccess()再次運行,和Request的= 「/」?

我不知道他們爲什麼運行兩次,第二次,request.path =「/」?

謝謝了, 林

回答

4

第二次,url將是空的,因爲flash背景下被清除,除非明確告知,that is it's default behavior它不保留其值超過一個後續請求。

它兩次遇到checkAccess的原因不在您發佈的代碼中,所以我無法對此發表評論。我可以說你正在混淆這個流程。使用默認安全代碼發生事件的順序如下:

  1. 網址請求,checkAccess被解僱。
  2. checkAccess通過重定向到登錄頁面拒絕訪問,將當前請求url放入Flash範圍。
  3. loginauthenticate做他們的事情(實際登錄),然後在authenticate結束它調用redirectToOriginalURL
  4. redirectToOriginalURL向瀏覽器發送重定向,瀏覽器發出請求。
  5. Url請求,checkAccess被解僱。
  6. checkAccess確認這次我們進行了身份驗證,因此不採取任何操作,允許控制器方法開始執行其操作並返回正常結果。

因此,您的問題中的步驟3和4不可能是Secure模型故障(至少使用默認代碼)。您必須檢查其餘代碼才能找到此行爲的來源。