gpt4 book ai didi

java - 变量 Spring Security 身份验证提供者列表

转载 作者:搜寻专家 更新时间:2023-11-01 03:51:44 28 4
gpt4 key购买 nike

我想有条件地将身份验证提供程序添加到我的身份验证管理器中,但我不知道该怎么做。

假设我定义了以下身份验证管理器:

<security:authentication-manager id="myAuthenticationManager" erase-credentials="true">
<security:authentication-provider ref='ldapAuthenticationProvider'/>
<security:authentication-provider ref='adLdapAuthenticationProvider'/>
<security:authentication-provider user-service-ref='dbAthenticationService'>
<security:password-encoder ref="myPasswordDigest">
<security:salt-source ref="saltSource"/>
</security:password-encoder>
</security:authentication-provider>
</security:authentication-manager>

就目前而言,Spring Security 正在运行;我可以根据 LDAP、Active Directory 或我的数据库进行身份验证。我也可以选择删除其中一个提供程序,并且一切仍会继续正常运行,所以一切都很好。

但是,我希望使用 Spring 配置文件,我可以动态填充身份验证提供程序列表。因此,例如,在我的应用程序上下文结束时,我会有

<beans profile="db">
<!-- Somehow add the following to myAuthenticationManager
<security:authentication-provider user-service-ref='dbAthenticationService'>
<security:password-encoder ref="myPasswordDigest">
<security:salt-source ref="saltSource"/>
</security:password-encoder>
</security:authentication-provider> -->
</beans>
<beans profile="ldap">
<!-- Somehow add the following to myAuthenticationManager
<security:authentication-provider ref='ldapAuthenticationProvider'/> -->
</beans>
<beans profile="ad">
<!-- Somehow add the following to myAuthenticationManager
<security:authentication-provider ref='adLdapAuthenticationProvider'/> -->
</beans>

我已经准备好配置文件切换机制,并且每个 Prodvider 都已单独正确配置。我只想动态填充要在初始化时使用的列表。这可能吗?

谢谢

最佳答案

一种解决方案可能是注册一个身份验证提供程序。该提供者(见下文)具有对所有身份验证提供者的引用并转发给正确的提供者。

我还没有测试过这个解决方案。

public class CompositeAuthenticationProvider implements AuthenticationProvider {

private final List<AuthenticationProvider> providers = new ArrayList<>();

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
final AuthenticationProvider provider = getAuthenticationProvider(authentication.getClass());

if(provider == null){
throw new ProviderNotFoundException("The authentication [" +authentication
+ "] is not supported by any provider");
}

return null;
}

@Override
public boolean supports(final Class<?> authentication) {
return getAuthenticationProvider(authentication) != null;
}

private AuthenticationProvider getAuthenticationProvider(Class<?> authentication) {
for (AuthenticationProvider provider : providers) {
if (provider.supports(authentication)) {
return provider;
}
}
return null;
}

@Autowired
public void setProviders(List<AuthenticationProvider> providers) {
this.providers.addAll(providers); // you could order them with @Order, just use a sorter
}
}

XML 定义:

<bean id="compositeAuthenticationProvider"
class="CompositeAuthenticationProvider" autowire-candidate="false"/>

关于java - 变量 Spring Security 身份验证提供者列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25297671/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com