我在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;
}
}
答案 0 :(得分:0)
在应用程序运行之前,您不需要填充角色(我想)。因此,一件可行的方法是注入ApplicationContext
而不是ContextSource
,然后懒洋洋地查看后者。如果可行的话可能会有卡车@Lazy
。