我的问题是我希望有两个身份验证提供程序
BEFORE: 我有我的UserDetailServiceImpl并且我根据DB验证了用户(不确定是什么提供者)用户根据DB中的数据获得了角色
立即: 我使用了ActiveDirectoryLdapAuthentication提供程序,如下所示
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
super.configure(auth);
auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).userDetailsService(userDetailService);
}
@Bean
public AuthenticationManager authenticationManager() {
return new ProviderManager(Arrays.asList(activeDirectoryLdapAuthenticationProvider()));
}
@Bean
public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
MyActiveDirectoryLdapAuthenticationProvider provider = new MyActiveDirectoryLdapAuthenticationProvider(domain, url, rootDN);
provider.setConvertSubErrorCodesToExceptions(true);
provider.setUseAuthenticationRequestCredentials(true);
return provider;
}
我做到了,所以我能够进行身份验证。
问题:
那么如何启用两个提供商? 如何向用户添加角色,通过LDAP auth.provider进行身份验证?
我也非常感谢"大图片"描述这里发生了什么(引擎盖下)。这里使用的每个类的作用是什么,它真的不清楚它是如何工作的(AuthenticationManager,AuthenticationManagerBuilder,AuthenticationProvider等)也许它只是被自动配置所隐藏,所以,但即使是直接查看Spring Security也不能让我任何更聪明的人。
感谢任何提示
UPDATE 此代码似乎正常工作
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).userDetailsService(userDetailService);
}
public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
MyActiveDirectoryLdapAuthenticationProvider provider = new MyActiveDirectoryLdapAuthenticationProvider(domain, url, rootDN);
provider.setConvertSubErrorCodesToExceptions(true);
provider.setUseAuthenticationRequestCredentials(true);
provider.setAuthoritiesMapper(new SimpleAuthorityMapper());
return provider;
}
答案 0 :(得分:1)
问题太多了!
两个提供程序都已启用,因为您将它们都添加到AuthenticationManagerBuilder
。但是你将它们都添加到同一个过滤器链中,并且都接受相同类型的Authentication
作为输入,因此其中一个总是掩盖另一个。
标准LdapAuthenticationProvider
有authoritiesMapper
,您可以使用@Beans
将目录条目中的权限映射到您的用户(通常使用目录组开箱即用,例如,请参阅{{3} })。我想如果您的目录不包含组,则可以使所有用户具有相同的权限或使用自定义映射器。
您的AuthenticationManager
类型AuthenticationProvider
和AuthenticationManagerBuilder
看起来多余(可能有害,因为它们是全球性的,您正在为单个过滤器链配置AuthenticationManager
) 。我怀疑你需要@Bean
方法,而另一方法不需要公开或{{1}}(可能)。