2016-06-30 35 views
1

從容器管理的身份驗證轉移到Grails 3.1.9應用程序中的Spring Security插件。在容器管理的世界中,我們的Grails攔截器爲安全資源執行AFTER身份驗證。然而,隨着春季安全,攔截器(帶前()邏輯)按以下順序執行:在身份驗證和操作執行之間可以執行攔截器嗎?

  1. 呼叫擔保資源
  2. 攔截器棧攔截請求,
  3. 重定向到表單登錄頁面
  4. 返回true
  5. 成功認證
  6. 重定向到請求的資源

我們攔截器建議立即進行刪除d僅針對經過認證的用戶開火。有沒有辦法讓攔截器在步驟4之間執行,而不是這個流程?或者,我們的攔截器邏輯需要遷移到Spring Security過濾器嗎?

+0

我和這個問題有同樣的要求,但我無法按照答案。我編寫的攔截器在從intellij或grails run-app運行時工作正常,但是當我將它作爲war文件部署在tomcat中時,所有地獄破壞都會丟失。我的令牌得到驗證,但我得到springSecurityService.principal = null。細節在這個問題。 –

回答

2

如果您查看2.x應用程序中的流程,這會更清楚一點,因爲有一個web.xml文件,它更清晰地說明幾個部件運行的順序,但它在2.x中基本相同和3.x.

該插件的過濾器鏈被註冊爲一個過濾器,它被配置爲在grailsWebRequest過濾器之後但在GrailsDispatcherServlet之前運行。這是爲了支持可能具有與默認值不同的URL映射的註釋控制器(例如PersonController.show()可能映射到/person/show,但該應用程序可能已將其映射到任何有效的uri(以及REST動詞的組合),所以我需要能夠搜索已編譯的url映射實例,以找出當前請求將運行的控制器操作。在過濾器中,我知道請求的URL是什麼,但不知道要應用什麼安全規則;如果一切都是基於url的它會很簡單,並且在啓動時進行預編譯,但是帶註釋的控制器我只知道哪些規則適用於控制器方法

該servlet在過濾器之後運行,並且這是確定和調用控制器的地方。不要與2.x中的servlet Filters混淆)實際上是獲取com的Spring HandlerInterceptors與'處理程序'一起構成HandlerExecutionChain。這是足夠通用的,可以處理任何類型的請求,但實際上處理程序是一個控制器,所以範圍要比它是一個servlet過濾器窄得多。

因此,要回到您的實際問題,您的最佳選擇是在添加到Spring Security過濾器鏈中的過濾器中完成工作。這些實現起來相當簡單,並且在plugin docs中描述了該過程。

+0

我和這個問題有相同的要求,但我無法遵循答案。我編寫的攔截器在從'intellij'或'grails run-app'運行時工作正常,但是當我將它作爲war文件部署在tomcat中時,所有地獄破壞都會丟失。我的令牌得到認證,但我得到'springSecurityService.principal = null'。詳細信息在這[問題](https://stackoverflow.com/questions/43999961/springsecurityservice-principal-returns-null-when-deployed-as-a-war-in-tomcat-8)。 –

相關問題