2010-02-17 2 views
5

Обычно, когда вы заявляете о другом «< аутентификационном провайдере >» для вашего приложения (webapp в моем случае), Spring Security заботится о вызове провайдеров один за другим, в случае сбоя. Итак, скажем, у меня есть DatabaseAuthenticationProvider и LDAPAuthenticationProvider с DatabaseAuthenticationProvider, объявленными сначала в файле конфигурации, во время выполнения сначала запускается DatabaseAuthenticationProvider, и если аутентификация завершается неудачно, проверяется проверка LDAPAuthentication. Это классно. Тем не менее, мне нужен коммутатор времени исполнения.Переключение аутентификационных подходов во время выполнения с помощью Spring Security?

Я хотел бы иметь возможность выбирать между этими двумя подходами (аутентификация на основе базы данных/аутентификация на основе ldap) и как-то развернуть реализацию на основе глобальной настройки thsi.

Как это сделать? Возможно ли это с помощью Spring-Security?

ответ

4

Я оставлю, как вводить свой собственный пользовательского поставщика проверки подлинности другой мириады примеров из Googleland и здесь на StackOverflow. Похоже, что это связано с маркировкой определенного компонента с помощью xml. Но, надеюсь, я смогу заполнить некоторые другие детали для вас.

Итак, вы определили класс несколько выше, как и я добавлю больше деталей, что вам нужно для весны (т.е. объединить материал сверху, а также.

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

Это позволит вы впрыснуть множество провайдеров с помощью пружины:

<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

3

Как насчет написания делегирования AuthenticationProvider, который знает, как получить доступ к вашему коммутатору времени выполнения и фактическим экземплярам базы данных/LDAP 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

+0

@Matt Я знаю, что это глупый вопрос, но я просто еще один новичок в Весне. – Jay

+0

Jay, я напишу позже, с более подробной информацией, но вы можете ввести их в свой SwitchingAuthenticationProvider как еще один весенний боб. – Matt

Смежные вопросы