【问题标题】:Switching authentication approaches at runtime with Spring Security?使用 Spring Security 在运行时切换身份验证方法?
【发布时间】:2011-01-17 18:54:35
【问题描述】:

通常,当您为应用程序(在我的情况下为 webapp)声明不同的“”时,Spring Security 会处理一个接一个地调用提供程序,以防万一失败。因此,假设我有 DatabaseAuthenticationProvider 和 LDAPAuthenticationProvider,并且在配置文件中首先声明了 DatabaseAuthenticationProvider,在运行时,首先调用 DatabaseAuthenticationProvider,如果身份验证失败,则尝试 LDAPAuthentication。这很酷 - 但是,我需要的是运行时开关。

我想在这两种方法(基于数据库的身份验证/基于 ldap 的身份验证)之间进行选择,并以某种方式基于 thsi 全局设置切换实现。

我该怎么做? Spring-Security 甚至有可能吗?

【问题讨论】:

    标签: java spring authentication jakarta-ee spring-security


    【解决方案1】:

    我将把如何注入您自己的自定义身份验证提供程序留给来自GooglelandStackOverflow 的其他无数示例。看起来它与使用 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”,用于类似故障转移的功能。一旦你注入了委托人,可能性就取决于你了。

    如果这没有回答您的问题,请告诉我。

    【讨论】:

    • @Matt 谢谢。这有帮助。我会试试这个,让你知道。
    【解决方案2】:

    如何编写一个委托 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);
        }
    
        ....
    }
    

    【讨论】:

    • @Matt 这很好。但是,如何填充该身份验证提供程序列表?
    • @Matt 我知道这是一个愚蠢的问题,但我只是另一个春季新手。
    • Jay,我稍后会写更多,有更多细节,但你可以将它们作为另一个 spring bean 注入到 SwitchingAuthenticationProvider 中。
    • 在运行时动态换出提供程序怎么样?假设我们有一堆从数据库加载的 OAuth2 提供者,我们想要添加一个新的或删除一个现有的。
    猜你喜欢
    • 2012-11-27
    • 2011-10-17
    • 1970-01-01
    • 2012-07-05
    • 2018-08-09
    • 2012-11-10
    • 2017-04-15
    • 2011-08-14
    相关资源
    最近更新 更多