2012-07-04 87 views
1

我有一個應用程序需要用戶在兩種不同的驗證方法中進行選擇。 一個是用戶名/密碼認證,另一個是用戶名/密碼/一次性密碼。Grails spring安全添加驗證方法

我創建了額外的認證供應商,並覆蓋在我的resources.groovy DaoAuthenticationProvider的時候提供商時,在http://burtbeckwith.com/blog/?p=1090

但是現在,當我需要我的身份驗證方法通過側與標準DaoAuthenticationProvider的時候住邊做它工作得很好我有點卡住了。

我知道我有我的自定義身份驗證提供程序和在resources.groovy中註冊的自定義過濾器。問題是我如何使URL(「重定向/ my_auth到過濾器」)被我的自定義過濾器攔截?

回答

1

而不是在resources.groovy中註冊過濾器,您可以使用Config.groovy中的filterChain配置來執行此操作。聲明所有的過濾器彈簧安全將使用在filterchain.filterNames,包括你想要的標準過濾器,以及你自定義的:

grails.plugins.springsecurity.filterChain.filterNames = [ 
    'securityContextPersistenceFilter', 'logoutFilter', 
    'authenticationProcessingFilter', 'firstCustomFilter','secondCustomFilter', 
    'rememberMeAuthenticationFilter', 'anonymousAuthenticationFilter', 
    'exceptionTranslationFilter', 'filterInvocationInterceptor' 
] 

那麼你的自定義過濾器映射到特定的URL - 要做到這一點的一種方式使用排除如下:

grails.plugins.springsecurity.filterChain.chainMap = [ 
    '/customUrlOne/**': 'JOINED_FILTERS,-secondCustomFilter', 
    '/customUrlTwo/**': 'JOINED_FILTERS,-firstCustomFilter', 
    '/**': 'JOINED_FILTERS,-firstCustomFilter,-secondCustomFilter' 
] 

JOINED_FILTERS是集您在第一張地圖中聲明的所有過濾器。在「/ **」下,除您排除的自定義過濾器以外的所有過濾器都將處於活動狀態。同樣,在自定義網址下,所有過濾條件將減去爲其他網址指定的已排除的自定義過濾條件。這將確保交通要customUrlOne截獲firstCustomFilter和交通要customUrlTwosecondCustomFilter被截獲。

+0

沒有得到這個工作。在resources.groovy中取消註釋我的過濾器註冊,並添加了上面的代碼,獲得投訴,我的過濾器在啓動期間沒有找到(意思是我需要註冊它嗎?)。 即使我註冊了它鏈路地圖發生了什麼錯誤,因爲它似乎從來沒有打我的自定義過濾器 – Iman

+0

現在我創建了一個替代解決方案,其中我的登錄表單發佈一個字段的身份驗證方法,然後我註冊一個過濾器作爲authenticationProcessingFilter和在那裏根據所提出的認證方法確定要創建什麼認證對象。 認證對象如下 布爾支撐物連接到我的認證供應商(類<?擴展對象> authenticationClass){ CustomAuthentication.isAssignableFrom authenticationClass } 但是你的解決方案是更優雅,如果我能得到它的工作:) – Iman