在配置中自定义LdapAuthoritiesPopulator

时间:2016-08-15 19:11:16

标签: spring spring-security ldap spring-security-ldap

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没有提供配置它的方法。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您需要添加以下内容:

final SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);

在您开始搜索之前。 为什么它被称为“控制”超出了我(一个LDAP人),但这就是Spring所做的。

-Jim

答案 1 :(得分:0)

解决方案是在LdapAuthoritiesPopulator中设置此属性并将其传递给LdapAuthenticationProvider

请参考以下示例1:https://www.programcreek.com/java-api-examples/?api=org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator

@Bean  公开的LdapAuthoritiesPopulator权威Populator(){

    DefaultLdapAuthoritiesPopulator populator = new DefaultLdapAuthoritiesPopulator(
            contextSource(),
            groupSearchBase);

    populator.setGroupSearchFilter("(uniqueMember={0})");
    populator.setGroupRoleAttribute("cn");
    **populator.setSearchSubtree(true);**
    populator.setRolePrefix("");

    return populator;
}