OpenLiberty 23.0.0.9 连接到 OpenLDAP 2.5.16。在
中使用自定义过滤器用户由 uid 标识 - 例如,用户 Roy McRoy 的 uid 为“roy”。
组属于 objectClass posixGroup。成员由 MemberUid 属性中的“uid”值标识。例如,组“Controlled”具有属性值“MemberUid:roy”,以表明 roy 是“Controlled”组的成员。
groupMemberIdMap 是“posixGroup:memberUid”
但是 - 这就是问题所在! - 当 Liberty 搜索组以查找 MemberUid 值时,它始终使用用户的完整 DN= 进行搜索,而不仅仅是短 uid 值。
我想在 Liberty 中配置 LDAP 存储库,以便 Liberty 搜索组:
memberUid=roy
...而不是...
memberUid=cn=roy,ou=i2users,dc=i2support,dc=lan
但到目前为止似乎没有任何效果。我究竟做错了什么?如何仅搜索“roy”的群组成员身份?
通过 server.xml 中的元素打开 LDAP 日志记录会显示 Liberty 使用 roy 的完整 DN 值作为搜索词:
[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
正确地找不到任何组 - 因为 MemberUid 的实际值只是“roy”,而不是“cn=roy,ou=foousers,dc=foosupport,dc=lan”
这是我的存储库:
<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 信息:
[root@LDAP01 ~]# ldapsearch -xLLL -D "cn=Manager,dc=foosupport,dc=lan" -W "(uid=roy)"
Enter LDAP Password:
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: [email protected]
userPassword:: UEBzc3dvcmQwMSE=
cn: roy
[root@LDAP01 ~]# ldapsearch -xLL -D "cn=Manager,dc=foosupport,dc=lan" -W "(&(objectClass=posixGroup)(cn=Controlled))"
Enter LDAP Password:
version: 1
dn: cn=Controlled,ou=fooGroups,dc=foosupport,dc=lan
gidNumber: 259
cn: Controlled
objectClass: posixGroup
objectClass: top
memberUid: bill
memberUid: fred
memberUid: roy
[root@LDAP01 ~]# ldapsearch -xLL -D "cn=Manager,dc=foosupport,dc=lan" -W "(&(objectClass=posixGroup)(memberuid=roy))"
Enter LDAP Password:
version: 1
dn: cn=Analyst,ou=fooGroups,dc=foosupport,dc=lan
gidNumber: 257
cn: Analyst
objectClass: posixGroup
objectClass: top
memberUid: roy
memberUid: fred
memberUid: bill
dn: cn=Controlled,ou=fooGroups,dc=foosupport,dc=lan
gidNumber: 259
cn: Controlled
objectClass: posixGroup
objectClass: top
memberUid: bill
memberUid: fred
memberUid: roy
[root@LDAP01 ~]#
如何让 Liberty 搜索组成员身份,就像我自己的 ldapsearch 推荐搜索一样?
没有范围可以更改 LDAP 数据库,它属于拥有数千名用户、数百个办公室和许多其他 LDAP 消耗应用程序的联邦政府组织。我必须让 Liberty 与 LDAP 服务器配合使用,而不是相反。
非常感谢您的帮助!
最后,我们与 IBM 建立了 PMR,以便 WebSphere SME 可以查看它。他们的回答是:这在自由城是做不到的。 Liberty 将始终使用完整 DN 搜索组成员身份,您不能强制它使用截断的 uid 值。
可以说,根本问题是 RFC 2307 中的模糊性。它在模式中定义了 memberUid,但没有说明memberUid 值中应该包含哪些数据。一种实现可以使用纯 uid,另一种实现使用完整 DN。它们都是“RFC 兼容” - 但不兼容。
因此我们放弃 LDAP,转而考虑客户端证书身份验证。