Переключение аутентификации приближается во времени выполнения с безопасностью Spring?

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

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

Как я делаю это? Это даже возможно с безопасностью Spring?

6
задан Jay 17 February 2010 в 09:51
поделиться

2 ответа

Я оставлю, как ввести ваш собственный пользовательский поставщик аутентификации в другое множество примеров из 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» для функции переключения на резервный ресурс. После того, как делегат ввел, возможности зависят от вас.

Дайте мне знать, если это не отвечает на ваш вопрос.

4
ответ дан 16 December 2019 в 21:39
поделиться

Как насчет написания делегирующего 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);
    }

    ....
}
4
ответ дан 16 December 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: