使用 Spring Security 在运行时切换身份验证方法?
Posted
技术标签:
【中文标题】使用 Spring Security 在运行时切换身份验证方法?【英文标题】:Switching authentication approaches at runtime with Spring Security? 【发布时间】:2011-01-17 18:54:35 【问题描述】:通常,当您为应用程序(在我的情况下为 webapp)声明不同的“”时,Spring Security 会处理一个接一个地调用提供程序,以防万一失败。因此,假设我有 DatabaseAuthenticationProvider 和 LDAPAuthenticationProvider,并且在配置文件中首先声明了 DatabaseAuthenticationProvider,在运行时,首先调用 DatabaseAuthenticationProvider,如果身份验证失败,则尝试 LDAPAuthentication。这很酷 - 但是,我需要的是运行时开关。
我想在这两种方法(基于数据库的身份验证/基于 ldap 的身份验证)之间进行选择,并以某种方式基于 thsi 全局设置切换实现。
我该怎么做? Spring-Security 甚至有可能吗?
【问题讨论】:
【参考方案1】:我将把如何注入您自己的自定义身份验证提供程序留给来自Googleland 和*** 的其他无数示例。看起来它与使用 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 提供者,我们想要添加一个新的或删除一个现有的。以上是关于使用 Spring Security 在运行时切换身份验证方法?的主要内容,如果未能解决你的问题,请参考以下文章
在运行时延迟初始化 Spring Security + 重新加载 Spring Security 配置
HandlerInterceptorAdapter 在使用 Spring Security 登录时不运行
如何在 Spring Security 中动态切换应用程序上下文?
在 docker 容器中运行可运行 jar 时,Grails Spring Security Active Directory 登录失败