Как правило, когда Вы объявляете отличающийся" <поставщик аутентификации>" для Вашего приложения (веб-приложение в моем случае), безопасность Spring заботится о вызове поставщиков один за другим, упакуйте отказа. Так, скажите, что у меня есть DatabaseAuthenticationProvider и LDAPAuthenticationProvider с DatabaseAuthenticationProvider, объявленным сначала в файле конфигурации во времени выполнения, DatabaseAuthenticationProvider вызывается сначала и если аутентификация перестала работать, LDAPAuthentication пробуют. Это прохладно - Однако, в чем я нуждаюсь, переключатель во время выполнения.
Я хотел бы иметь опцию chosing между этими двумя подходами (основанная на базе данных аутентификация / ldap базирующаяся аутентификация) и так или иначе swith реализация на основе thsi глобальной установки.
Как я делаю это? Это даже возможно с безопасностью Spring?
Я оставлю, как ввести ваш собственный пользовательский поставщик аутентификации в другое множество примеров из Googleland и здесь на StackOverflow . Похоже, это связано с пометкой определенного компонента xml. Но, надеюсь, я смогу заполнить некоторые другие детали для вас.
Итак, вы определили класс несколько как выше, и я добавлю больше деталей, которые вам понадобятся для Spring (то есть объединить материал сверху также.
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» для функции переключения на резервный ресурс. После того, как делегат ввел, возможности зависят от вас.
Дайте мне знать, если это не отвечает на ваш вопрос.
Как насчет написания делегирующего AuthenticationProvider, который знает, как получить доступ к вашему переключателю времени выполнения и фактическим экземплярам Database / 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);
}
....
}