2010-02-17 83 views
5

通常,當你爲你的應用程序聲明不同的「<認證提供程序>」(在我的情況下是webapp)時,Spring Security會一個接一個地處理調用提供程序,以避免失敗。因此,假設我在配置文件中聲明瞭DatabaseAuthenticationProvider的DatabaseAuthenticationProvider和LDAPAuthenticationProvider,並在運行時首先調用DatabaseAuthenticationProvider,並且如果身份驗證失敗,則嘗試LDAPAuthentication。這很酷 - 但是,我需要的是一個運行時切換器。使用Spring Security在運行時切換身份驗證方法?

我想在這兩種方法(基於數據庫的認證/基於LDAP的認證)之間選擇一個選項,並以某種方式基於全局設置開啓實現。

我該怎麼做? Spring-Security甚至有可能嗎?

回答

4

我會留下怎樣自定義的身份驗證提供者從Googleland注入到實例其他無數,並在這裏StackOverflow。它看起來好像是用xml標記特定的bean。但希望我能爲你填寫一些其他細節。

所以你定義的類有點像上面我會添加更多的細節,你需要爲Spring(即從上面的合併,以及東西。

public class SwitchingAuthenticationProvider implements AuthenticationProvider 
{ 
    .... 
    public List<AuthenticationProvider> getProviders() { return delegateList; } 
    public void setProviders(List<AuthenticationProvider> providers) { 
     this.delegateList = providers; 
    } 
    .... 
} 

這將使使用了Spring注入提供商的主機:

<bean id="customAuthProvider1" class=".....CustomProvider1"> ... </bean> 
<bean id="customAuthProvider2" class=".....CustomProvider2"> ... </bean> 
... 
<bean id="customAuthProviderX" class=".....CustomProviderX"> ... </bean> 

<bean id="authenticationProvider" class="....SwitchingAuthenticationProvider"> 
    <security:custom-authentication-provider/> 
    <!-- using property injection (get/setProviders) in the bean class --> 
    <property name="providers"> 
     <list> 
      <ref local="customAuthProvider1"/> <!-- Ref of 1st authenticator --> 
      <ref local="customAuthProvider2"/> <!-- Ref of 2nd authenticator --> 
      ... 
      <ref local="customAuthProviderX"/> <!-- and so on for more --> 
     </list> 
    </property> 
</bean> 

你到底如何填充供應商原本可以得到委託人提供程序的集合,他們是如何映射高達哪一個使用任何手段達到。你可以將這個集合映射成一個已命名的,基於當前的狀態委託。它可能是一個不止一個嘗試的列表。它可以是兩個屬性,「get/setPrimary」和「get/setSecondary」用於故障切換功能。一旦你有了代理注入的可能性取決於你。

讓我知道這是不是回答你的問題。

+0

@Matt謝謝。這有助於。我會試試這個,讓你知道。 – Jay 2010-02-18 19:20:45

3

如何編寫知道如何訪問您的運行時切換器以及Database/LDAP AuthenticationProvider的實際實例的委託AuthenticationProvider。

我在想是這樣的:

public class SwitchingAuthenticationProvider implements AuthenticationProvider 
{ 
    private List<AuthenticationProvider> delegateList; 
    private int selectedProvider; 

    @Override 
    public Authentication authenticate(Authentication authentication) 
     throws AuthenticationException 
    { 
     AuthenticationProvider delegateTo = delegateList.get(selectedProvider); 
     return delegateTo.authenticate(authentication); 
    } 

    .... 
} 
+0

@Matt這很好。但是,如何填充認證提供者列表? – Jay 2010-02-18 12:09:08

+0

@Matt我知道這是一個愚蠢的問題,但我只是另一個春天新手。 – Jay 2010-02-18 12:09:36

+0

Jay,我會稍後再寫一些更詳細的內容,但是可以將它們作爲另一個spring bean注入到您的SwitchingAuthenticationProvider中。 – Matt 2010-02-18 14:04:38

相關問題