2014-02-18 97 views
2

我有一個過濾器設置如下來控制用戶登錄狀態。Grails過濾器停止工作後

class SecurityFilters { 
    def filters = { 
    login(controller:'login|logout|proxy|API|error', action:'*', invert: true) { 
     before = { 
     if (!session.isLoggedIn){ 
      switch(controllerName){ 
      case "enroll": 
       switch(actionName){ 
       ... 
       default: 
        log.warn "Permission Denied. Default action for enroll." 
        render(view: '/permissionDenied', model: [message: "You must be logged in to access the enroll system. If you are a consumer, please contact your agent for more information."]) 
        break 
       } 
       break 
      ... 

     } 
     else { 
      switch(controllerName){ 
      case "agent": 
       if (!session.user.isAgent) { 
       render view: "/permissionDenied", model: [message: 'This portion of the site is only available to agents.'] 
       return false 
       } 
       break 

      .... 
      }// switch 
     }// else 
     }// before 
     ... 
    }// login 
    }// filters 

我遇到的問題是,當我在開發運行這個它工作正常,但當我我們的QA系統上運行它,它工作正常了一會兒,然後突然停止工作正常。

我添加了日誌記錄,我可以看到會話信息在過濾器中可用,會話變量(session.user.isAgent)設置正確(true),但是if(!session.user.isAgent )無論如何都會執行。

我似乎可以找到奇怪行爲的原因。

我的問題是有人看到過這種行爲之前,他們是如何解決它或有任何想法在哪裏尋找可能的原因突然改變過濾器的工作方式。

在此先感謝。

UPDATE(2014年2月19日): 在努力追捕導致過濾器並沒有在if(!session.user.isAgent)執行的代碼添加更多的日誌記錄,因爲它是後做之前。現在它運行正常,然後只執行渲染線,當用戶沒有登錄時。日誌記錄仍然顯示用戶已經登錄並且他是代理,但是它運行渲染而不是上面的代碼。這是因爲如果有一個「轉到」渲染線在完成代理是否登錄後檢查。

同樣的任何信息或解決方案,將不勝感激

回答

0

我有幾個問題有過濾網及Groovy的真相。我看到的問題是沒有記錄錯誤,即使採用了積極的異常捕獲(即捕獲Throwable),瀏覽器中的唯一輸出是空白頁。這似乎只發生在過濾器 - 在其他地方記錄錯誤。

就我而言,問題歸結爲Groovy的真相。我試圖在會話中設置一個布爾屬性,但是每次我這樣做都失敗了。最後,我不得不將該值轉換爲一個字符串,然後進行設置,並且工作。

我知道這不是一個直接的答案,但我已經被上面的幾次咬過了,例如,懶惰的GString評估。

如果您仍在調試,我會記錄一些輸出,顯示您認爲正在處理的基礎類類型。這可能是因爲當你的布爾條件被評估超過一個異常被拋出和吞下時。我會記錄每個條件語句的實際值,看看它們是什麼。還要逐一刪除每一行,以查看失敗是否消失。和/或用絕對值替換您的條件,即真/假來查看代碼是否被執行。如果確實如此,則指向當前條件評估中的錯誤。

+0

經過進一步的研究,我認爲這可能是在2.3版本中解決的一個錯誤,但不幸的是我無法將grails版本升級到該項目,因爲它被置於維護模式。我的臨時解決方案是在每個控制器方法的頂部添加檢查。醜陋,但它完成了工作。 –

相關問題