Spring security 从LdapAuthoritiesPopulator内部查找LDAP条目

Spring security 从LdapAuthoritiesPopulator内部查找LDAP条目,spring-security,spring-boot,spring-ldap,spring-security-ldap,Spring Security,Spring Boot,Spring Ldap,Spring Security Ldap,我在Spring引导应用程序中使用Spring Security和Spring Security ldap进行身份验证 我想实现一个LdapAuthoritiesPopulator,它从LDAP服务器中查找一些条目来决定用户的角色。这些条目不在用户下,因此提供给GetGrantedAuthories方法的userData对象不够。我无法控制LDAP服务器,因此无法将角色添加到用户条目中 我考虑将Spring Security在调用auth.ldapaauthentication.ContextS

我在Spring引导应用程序中使用Spring Security和Spring Security ldap进行身份验证

我想实现一个LdapAuthoritiesPopulator,它从LDAP服务器中查找一些条目来决定用户的角色。这些条目不在用户下,因此提供给GetGrantedAuthories方法的userData对象不够。我无法控制LDAP服务器,因此无法将角色添加到用户条目中

我考虑将Spring Security在调用auth.ldapaauthentication.ContextSource时创建的ContextSource(见下面代码中的1)注入到LDapaauthoritiesPopulator中。但这不起作用,因为LdapAuthoritiesPopulator是在WebSecurity配置适配器之前创建的,因此ContextSource还不存在

My WebSecurity配置适配器包含以下方法:

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {

    auth.ldapAuthentication()
            .contextSource() // (1)
                .url("ldap://example.org/o=organization")
                .and()
            .ldapAuthoritiesPopulator(ldapAuthoritiesPopulator)
            .userSearchFilter("uid={0}");
}
ldapAuthoritiesPopulator是自动连接的,该类当前是一个虚拟实现,只添加了角色\用户:


我想,在应用程序运行之前,您不需要填充角色。因此,一个可行的方法是注入ApplicationContext而不是ContextSource,然后懒洋洋地查找后者。如果这样做有效的话,可能会有一辆带有@Lazy的卡车

@Component
public class CustomLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator {

    @Override
    public Collection<? extends GrantedAuthority> getGrantedAuthorities(
        DirContextOperations userData, String username) {

        // I want to look up some entries in LDAP here, so I need a ContextSource
        // but I can't inject it because it does not exist when this bean is created

        Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        authorities.add(new SimpleGrantedAuthority("USER"));
        return authorities;
    }
}