java – Spring Security LDAP身份验证用户必须是AD组的成员

我按照以下方式配置了Spring Boot Security:
https://spring.io/guides/gs/securing-web/

我能够完美地使用我的凭据登录.但是,我需要添加一个检查,即AD用户也必须属于特定的AD组(即AD-this-a-specific-group).登录时,如果用户不属于特定的AD组,则应返回登录错误.

我一直在搜索几个小时,似乎无法在WebSecurityConfigurerAdapter中找到明确的方法,我是否正确使用了auth.groupSearchFilter?

这是我的代码:

@Configuration 
@EnableWebSecurity    
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
Environment env;

public LdapContextSource contextSource () {
    LdapContextSource contextSource= new LdapContextSource();

    contextSource.setUrl(env.getRequiredProperty("ldap.url"));
    contextSource.setBase(env.getRequiredProperty("ldap.baseDn"));
    contextSource.setUserDn(env.getRequiredProperty("ldap.bindDn"));
    contextSource.setPassword(env.getRequiredProperty("ldap.batchPassword"));
    contextSource.afterPropertiesSet();
    return contextSource;
}

@Override
protected void configure(AuthenticationManagerBuilder auth)
        throws Exception {
     auth.ldapAuthentication()
        .userSearchFilter("(cn={0})")           
        .groupSearchBase("OU=Account Groups,OU=ITS Security")
        .groupSearchFilter("(cn=AD-this-is-a-specific-group)") 
        .contextSource(contextSource()); 
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().anyRequest().fullyAuthenticated()
        .and()
        .formLogin();
}

解决方法:

不确定这是否是执行此操作的最佳方式(就Spring Security的生命周期而言),但基本上我提供了自己的DefaultLdapAuthoritiesPopulator,其中我只覆盖了getGroupMembershipRoles.

首先,我上面的auth.groupSearchFilter错误,它应该是:

    .groupSearchFilter("(member={0})") 

其次,我创建了一个带有重写方法的匿名类(调用super并检查角色列表中的成员资格):

auth
        .ldapAuthentication()
        .ldapAuthoritiesPopulator(new DefaultLdapAuthoritiesPopulator(contextSource, "OU=Account Groups,OU=ITS Security") {

            @Override
            public Set<GrantedAuthority> getGroupMembershipRoles(String userDn, String username) {
                Set<GrantedAuthority> groupMembershipRoles = super.getGroupMembershipRoles(userDn, username);

                boolean isMemberOfSpecificAdGroup = false;
                for (GrantedAuthority grantedAuthority : groupMembershipRoles) {

                    if ("ROLE_AD-this-is-a-specific-group".equals(grantedAuthority.toString())) {                                                       
                        isMemberOfSpecificAdGroup = true;
                        break;
                    }
                }

                if (!isMemberOfSpecificAdGroup ) {

                    throw new BadCredentialsException("User must be a member of " + "AD-this-is-a-specific-group");
                }
                return groupMembershipRoles;
            }
        })
        .userSearchFilter("(cn={0})")           
        .groupSearchBase("OU=Account Groups,OU=ITS Security")
        .groupSearchFilter("(member={0})") 
        .contextSource(contextSource); 
上一篇:Java:寻找一个库来读取LDAP数据


下一篇:PHP-使用Silex和Symfony 3配置LDAP身份验证