DefaultLdapAuthoritiesPopulator设置搜索范围“ONE_LEVEL”,但我需要搜索“SUBSCOPE”以获取用户所属的组列表。
我一直在遵循“配置”风格的Spring设置(代码,而不是XML)。虽然有很多关于如何在XML中配置自定义LdapAuthoritiesPopulator的示例,但我仍然坚持如何在代码中执行此操作。
这是我到目前为止所拥有的:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.ldapAuthentication()
.contextSource().url("ldap://ldap.company.org/")
.and()
.userSearchBase("o=company.org,c=us")
.userSearchFilter("(uid={0})")
.groupSearchBase("o=company.org,c=us")
.groupSearchFilter("(&(objectClass=groupOfUniqueNames)(uniqueMember={0}))");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin().and().authorizeRequests()
.antMatchers("/api/**").authenticated()
.anyRequest().permitAll();
}
}
缺少的是我需要能够在DefaultLdapAuthoritiesPopulator上设置搜索范围。该类本身公开了一个“setSearchSubtree”方法,但LdapAuthenticationProviderConfigurer没有提供配置它的方法。
有什么建议吗?
答案 0 :(得分:0)
您需要添加以下内容:
final SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
在您开始搜索之前。 为什么它被称为“控制”超出了我(一个LDAP人),但这就是Spring所做的。
-Jim
答案 1 :(得分:0)
解决方案是在LdapAuthoritiesPopulator中设置此属性并将其传递给LdapAuthenticationProvider
@Bean 公开的LdapAuthoritiesPopulator权威Populator(){
DefaultLdapAuthoritiesPopulator populator = new DefaultLdapAuthoritiesPopulator(
contextSource(),
groupSearchBase);
populator.setGroupSearchFilter("(uniqueMember={0})");
populator.setGroupRoleAttribute("cn");
**populator.setSearchSubtree(true);**
populator.setRolePrefix("");
return populator;
}