使用Spring Security在运行时切换身份validation方法?

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

我想有一个选择在这两种方法之间选择(基于数据库的身份validation/基于ldap的身份validation),并以某种方式基于这个全局设置来实现实现。

我该怎么做? 是否可以使用Spring-Security?

我将留下如何将自己的自定义身份validation提供程序注入到Googleland和StackOverflow上的其他大量示例中。 看起来它与使用xml标记特定bean有关。 但希望我能为您填写一些其他细节。

所以你已经像上面那样定义了类,我将添加更多你需要Spring的细节(即合并上面的东西)。

public class SwitchingAuthenticationProvider implements AuthenticationProvider { .... public List getProviders() { return delegateList; } public void setProviders(List providers) { this.delegateList = providers; } .... } 

这将允许您使用spring注入大量提供者:

  ...   ...  ...  ...           ...      

最后,您如何填充提供程序可以是让委托者获得提供程序集合的任何方法。 他们如何确定使用哪一个取决于您。 根据委托者的当前状态,集合可以是命名映射。 它可能是一个不止一个尝试的列表。 它可以是两个属性,“get / setPrimary”和“get / setSecondary”用于故障转移之类的function。 一旦您注册了委托人,可能性取决于您。

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

如何编写一个委托的AuthenticationProvider,它知道如何访问运行时开关以及Database / LDAP AuthenticationProvider的实际实例。

我想的是:

 public class SwitchingAuthenticationProvider implements AuthenticationProvider { private List delegateList; private int selectedProvider; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { AuthenticationProvider delegateTo = delegateList.get(selectedProvider); return delegateTo.authenticate(authentication); } .... }