从LdapAuthoritiesPopulator内部查找LDAP条目

时间:2014-08-05 10:08:18

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

我在Spring Boot应用程序中使用Spring Security和spring-security-ldap进行身份验证。

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

我考虑过在ContextSource调用auth.ldapAuthentication().contextSource()(请参阅下面的代码中的(1))时注入Spring Security创建的LdapAuthoritiesPopulator。但这不起作用,因为LdapAuthoritiesPopulator是在WebSecurityConfigurerAdapter之前创建的,因此ContextSource尚不存在。

我的WebSecurityConfigurerAdapter包含以下方法:

@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已自动装配,该类目前是一个虚拟实现,只需添加ROLE_USER

@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;
    }
}

1 个答案:

答案 0 :(得分:0)

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