如何深入LDAP树中找到可以在spring ldap security中进行身份验证的用户

Posted

技术标签:

【中文标题】如何深入LDAP树中找到可以在spring ldap security中进行身份验证的用户【英文标题】:How to deep into the LDAP tree to find a user who can authenticate in spring ldap security 【发布时间】:2019-11-11 19:45:08 【问题描述】:

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

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

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

子树有子树和用户。

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

我的 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");

谢谢

【问题讨论】:

【参考方案1】:

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

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

如果您的所有用户都存储在单个节点下 目录。

另一方面,userSearchFilter() 可用于匹配常规请求中的登录名,在特定基础下搜索树(默认 SearchScope =SUBTREE)。 userSearchBase() 可以选择用于设置分支 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

【讨论】:

以上是关于如何深入LDAP树中找到可以在spring ldap security中进行身份验证的用户的主要内容,如果未能解决你的问题,请参考以下文章

管理 ldap 中的特殊角色

Spring-WS WS-Security LDAP 身份验证

如何将 Spring Security 从 ldap 更改为 ldap starttls

Spring Security 自定义登录回退

如何在春季测试 LDAP 安全配置?

Spring 5,从 LDAP (AD) 获取信息