如何通过LDAP组的memberUid属性实现单查询获取组成员
如何通过LDAP组的memberUid属性实现单查询获取组成员
没问题,针对你这种OpenLDAP环境下用户没有memberOf属性、组用memberUid关联用户uid的场景,确实可以用LDAP的扩展匹配过滤器来实现单查询获取指定组的成员用户,完全符合你要单查询的需求。
核心思路
因为你的组是通过memberUid存储用户的uid来建立关联的,我们可以直接在用户对象的查询里,反向引用目标组的memberUid属性值,实现类似SQL的IN查询效果,不需要依赖用户对象的memberOf属性。
具体查询过滤器
直接用这个LDAP过滤器就能实现需求:
(&(objectClass=posixAccount)(uid:dn:=${cn=login_group,ou=groups,dc=example,dc=com}memberUid))
过滤器各部分解释
&:逻辑与运算符,要求同时满足后面两个条件(objectClass=posixAccount):限定查询范围为用户对象(你的用户LDIF里包含这个对象类,如果你的用户用的是inetOrgPerson等其他类,替换成对应的即可)(uid:dn:=${cn=login_group,ou=groups,dc=example,dc=com}memberUid):这是核心匹配规则,意思是:查找uid属性值等于指定组(cn=login_group,ou=groups,dc=example,dc=com)的memberUid属性中任意一个值的用户。这里的uid:dn:=是OpenLDAP支持的动态属性引用匹配,用来关联组的属性值和用户的属性值。
实际测试示例
你可以用ldapsearch命令来验证这个查询:
ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b "ou=people,dc=example,dc=com" "(&(objectClass=posixAccount)(uid:dn:=${cn=login_group,ou=groups,dc=example,dc=com}memberUid))"
注意事项
- 你的OpenLDAP 2.4.40版本默认支持这种扩展匹配规则,如果遇到问题可以检查服务器配置是否加载了相关模块
- 这个查询是完全的单LDAP请求,不需要客户端做任何二次处理,正好适配你用于第三方门户权限控制的需求
这个过滤器的逻辑和你写的SQL查询完全等价,都是从用户对象中找出uid在目标组memberUid列表里的用户。
备注:内容来源于stack exchange,提问作者André Fernandes
相关产品推荐
相关产品推荐

