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