首页 > 解决方案 > 如何深入LDAP树中找到可以在spring ldap security中进行身份验证的用户

问题描述

我想使用 spring security ldap 身份验证。但是我想递归地遍历 ldap 树。不幸的是,我只能找到一个级别或深度的用户。

例如,我的用户树如下所示:

ouUsers:拥有用户(user1、user2 等)和子树(ouGenel、ouYatay)。

子树有子树和用户。

我想递归遍历 ldap 树以在 spring 安全项目中进行身份验证。

我的春季身份验证代码如下,我应该在我的代码中更改什么?:

 @Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
            .ldapAuthentication()
            .userDnPatterns("CN={0},OU=ouUsers")
            .groupSearchBase("ou=ouUsers")
            .contextSource()
            .url(url+"/"+base)
            .managerDn(dn)
            .managerPassword(password)
            .and()
            .passwordCompare()
            .passwordEncoder(new LdapShaPasswordEncoder())
            .passwordAttribute("sn");
}

谢谢

标签: spring-securityactive-directoryldapspring-ldapspring-security-ldap

解决方案


您需要使用userSearchFilter()anduserSearchBase()而不是userDnPatterns().

  • userDnPatterns尝试通过替换提供的模式中的用户登录名来匹配 DN,并附加来自 LDAP url 的基数。

    如果您的所有用户都存储在目录中的单个节点下,这是可以的。

  • userSearchFilter()另一方面,可用于匹配常规请求中的登录名,在SUBTREE特定基础下搜索树(默认 SearchScope = )。userSearchBase()可以选择用于设置用户条目所在的分支 rdn,并从该分支 rdn 执行搜索。如果未指定,则搜索包括从 LDAP url 的基本 dn 开始的整个目录。

用以下内容替换 userDnPatterns() 应该没问题:

.userSearchBase('ou=ouUsers')
.userSearchFilter('(cn={0})')

https://docs.spring.io/spring-security/site/docs/3.0.x/reference/ldap.html#d0e5940


推荐阅读