【发布时间】:2011-01-17 18:54:35
【问题描述】:
通常,当您为应用程序(在我的情况下为 webapp)声明不同的“
我想在这两种方法(基于数据库的身份验证/基于 ldap 的身份验证)之间进行选择,并以某种方式基于 thsi 全局设置切换实现。
我该怎么做? Spring-Security 甚至有可能吗?
【问题讨论】:
标签: java spring authentication jakarta-ee spring-security
通常,当您为应用程序(在我的情况下为 webapp)声明不同的“
我想在这两种方法(基于数据库的身份验证/基于 ldap 的身份验证)之间进行选择,并以某种方式基于 thsi 全局设置切换实现。
我该怎么做? Spring-Security 甚至有可能吗?
【问题讨论】:
标签: java spring authentication jakarta-ee spring-security
我将把如何注入您自己的自定义身份验证提供程序留给来自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 注入大量提供程序:
<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”,用于类似故障转移的功能。一旦你注入了委托人,可能性就取决于你了。
如果这没有回答您的问题,请告诉我。
【讨论】:
如何编写一个委托 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);
}
....
}
【讨论】: