2011-04-13 77 views
1

我有一個使用自定義的身份驗證管理器進行登錄的應用程序。它只是在名爲Users的表上搜索。來自不同URL的不同登錄

<sec:authentication-manager alias="authenticationManager"> 
    <sec:authentication-provider user-service-ref="userDAOImpl"> 
     <sec:password-encoder hash="sha" /> 
    </sec:authentication-provider> 
</sec:authentication-manager> 

問題是,現在我需要做另一個登錄,必須在表「ExternalUsers」上搜索。

的應用將工作過程是這樣:

  1. 如果請求來自像/外部的URL/**我需要經過一個一個authenticationManager2其搜索在桌子上「ExternalUsers」。這些用戶只能訪問/ external/** url
  2. 它的請求來自另一個url,我需要通過一個authenticationManager1(我現在擁有的那個)在表上搜索用戶。這些用戶可以訪問所有的網址,但該模式匹配的那些/外部/ **

可能存在用戶與相同的用戶名錶用戶和ExternalUsers 。這就是爲什麼我需要根據URL來源設置不同的登錄名的原因。兩個登錄名都必須在同一個應用程序中。

是否有可能在Spring中配置兩個不同的認證管理器,每個認證管理器都取決於請求的URL地址?

謝謝

回答

1

我不認爲,那個春天提供它開箱即用。但是您可以實現自己的身份驗證提供程序(實現AuthenticationProvider接口),根據某些邏輯將身份驗證委派給一個兩個標準的Spring身份驗證提供程序。

+0

但是,authenticationManager的實現如何知道請求的url? – Javi 2011-04-13 13:24:30

+0

@Javi:我的錯:身份驗證提供程序不是管理員 – Ralph 2011-04-13 13:52:44

1

Spring Security的未來版本可能允許多個身份驗證管理器,但在此之前有些自定義功能才能完成這項工作。

我認爲拉爾夫的答案是正確的。您可以添加另一個http元素(Spring Security 3.1)來捕獲外部/ ** url模式,並添加您的自定義登錄過濾器以傳遞另一個令牌(可以將AbstractAuthenticationToken擴展爲ExternalUserPasswordAuthenticationToken)傳遞給身份驗證提供程序。見Configuring Spring Security 3.x to have multiple entry points和我的回答Authenticate user using external webservice in grails來開發自己的代幣和提供者。

另一種我不推薦的方法是設置一個執行驗證任務的/ external/** url模式的Voter。