OpenLiberty LDAP组查询问题:如何用uid而非完整DN检索成员?
问题:OpenLiberty LDAP组查询使用用户DN而非UID导致匹配失败
- 环境:OpenLiberty 23.0.0.9 + OpenLDAP 2.5.16
- LDAP结构规则:
- 用户通过uid标识(如用户Roy McRoy的uid为
roy) - 组为posixGroup对象类,成员通过
memberUid属性存储用户uid值(如Controlled组的memberUid包含roy)
- 用户通过uid标识(如用户Roy McRoy的uid为
- 已配置
groupMemberIdMap="posixGroup:memberUid",但Liberty查询组时仍使用用户完整DN(如cn=roy,ou=foousers,dc=foosupport,dc=lan)作为memberUid的查询值,导致组匹配失败。
LDAP日志确认的错误查询行为:
[2023-12-24T14:55:17.909+1100] 0000002f LdapConnectio > search Entry dc=foosupport,dc=lan (&(|(objectClass=posixGroup)(objectClass=posixgroup))(memberUid=cn=roy,ou=foousers,dc=foosupport,dc=lan)) null javax.naming.directory.SearchControls@25af6f52 null [2023-12-24T14:55:17.909+1100] 0000002f ContextManage > getDirContext Entry
当前ldapRegistry配置
<ldapRegistry id="OpenLDAPreg" ldapType="Custom" realm="ldapRealm" host="LDAP01.foobar.lan" port="389" baseDN="dc=foobar,dc=lan" bindDN="cn=Manager,dc=foobar,dc=lan" bindPassword="P@ssword01!"> <customFilters userIdMap="*:uid" groupIdMap="*:cn" userFilter="(&(uid=%v)(objectclass=person))" groupFilter="(&(cn=%v)(|(objectclass=posixGroup)))" groupMemberIdMap="posixGroup:memberUid"> </customFilters> </ldapRegistry>
LDIF信息
用户Roy McRoy
dn: cn=roy,ou=foousers,dc=foosupport,dc=lan objectClass: inetOrgPerson objectClass: organizationalPerson objectClass: person objectClass: top uid: roy sn: Analyst displayName: Roy McRoy mail: fred@foosupport.lan userPassword:: UEBzc3dvcmQwMSE= cn: roy
组Controlled
dn: cn=Controlled,ou=fooGroups,dc=foosupport,dc=lan gidNumber: 259 cn: Controlled objectClass: posixGroup objectClass: top memberUid: bill memberUid: fred memberUid: roy
解决方案
问题核心是缺少userMemberIdMap配置,导致Liberty默认使用用户DN作为组匹配的标识。添加该配置指定用户用于组匹配的属性为uid即可解决。
修改后的customFilters配置如下:
<customFilters userIdMap="*:uid" groupIdMap="*:cn" userFilter="(&(uid=%v)(objectclass=person))" groupFilter="(&(cn=%v)(|(objectclass=posixGroup)))" groupMemberIdMap="posixGroup:memberUid" userMemberIdMap="person:uid"> </customFilters>
配置说明
userMemberIdMap="person:uid":指定用户对象类(person,匹配用户的objectClass)对应的组匹配标识属性为uid,Liberty查询组时会自动使用用户的uid值替代DN去匹配memberUid。
修改配置后重启Liberty,LDAP日志中的组查询条件会变为(memberUid=roy),可正常匹配到目标组。
内容的提问来源于stack exchange,提问作者Andrew McLaren
相关产品推荐
相关产品推荐

