java - 使用 Spring Security 在运行时切换身份验证方法?

标签 java spring authentication jakarta-ee spring-security

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

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

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

最佳答案

我将把如何将您自己的自定义身份验证提供程序注入(inject)到 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 注入(inject)大量提供程序:

<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>

最后,您填充提供者的方式可能是让委托(delegate)者获得提供者集合的任何方式。它们如何映射到使用哪一个取决于您。该集合可以是一个命名映射,基于委托(delegate)者的当前状态。它可能是一个包含多个尝试的列表。它可以是两个属性,“get/setPrimary”和“get/setSecondary”,用于类似故障转移的功能。注入(inject)委托(delegate)人后,可能性由您决定。

如果这不能回答您的问题,请告诉我。

关于java - 使用 Spring Security 在运行时切换身份验证方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2279621/

相关文章:

java - Spring mvc Controller 类未在 [project-name]-target-classes 目录中生成

php - Laravel 5,验证和显示用户角色

java - 如何在动态JFreechart上画三条线?

java - JSF 页面片段和 ADF 数据绑定(bind)

java - 如何扩展默认的 Spring Boot CacheManager 配置

Spring Data JPA Meta JpaMetamodelMappingContext 内存消耗

IOS - 委托(delegate)与通知

authentication - native 应用程序中第一方身份验证的最佳实践

java - 使用 Android 应用程序中的内部存储传递数据

java - 包含包装标签的控制皮肤的首选高度