Quarkus LDAP 获取用户数据

Quarkus LDAP get user data

我正在使用 openLDAP 服务器在我的 quarkus 应用程序上对我的用户进行身份验证。 一切正常,但我想检索我的用户数据。

我以为它会在方法 identity.getAttributes() 中,但这给了我一个空的地图。

这是一个用户示例:

# tesla, example.com
dn: uid=tesla,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
objectClass: posixAccount
cn: Nikola Tesla
sn: Tesla
uid: tesla
mail: tesla@ldap.forumsys.com
uidNumber: 88888
gidNumber: 99999
homeDirectory: home

这也是我的 ldap 配置:

quarkus.security.ldap.enabled=true
quarkus.security.ldap.dir-context.url=ldap://ldap.forumsys.com:389/

quarkus.security.ldap.dir-context.principal=cn=read-only-admin,dc=example,dc=com
quarkus.security.ldap.dir-context.password=password

quarkus.security.ldap.identity-mapping.rdn-identifier=uid
quarkus.security.ldap.identity-mapping.search-base-dn=dc=example,dc=com

quarkus.security.ldap.identity-mapping.attribute-mappings."0".from=cn
quarkus.security.ldap.identity-mapping.attribute-mappings."0".to=groups
quarkus.security.ldap.identity-mapping.attribute-mappings."0".filter=(member=uid={0})
quarkus.security.ldap.identity-mapping.attribute-mappings."0".filter-base-dn=dc=example,dc=com

如何获取我的用户邮箱和 CN?

预先感谢您的帮助,

托马斯

好的,我找到了一个答案,虽然很丑,但确实有效。

因为我找不到如何使用框架获取我的数据,所以我尝试使用 ldapsearch 在命令行中获取它。 因此,我可以通过 运行ning 命令检索我的用户数据:

ldapsearch -H ldap://ldap.forumsys.com:389/ -x -D "cn=read-only-admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -LLL "(uid=tesla)"

这给了我:

dn: uid=tesla,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
objectClass: posixAccount
cn: Nikola Tesla
sn: Tesla
uid: tesla
mail: tesla@ldap.forumsys.com
uidNumber: 88888
gidNumber: 99999
homeDirectory: home

现在,身份验证有效,我可以从我的 SecurityIdentity 检索登录名(使用:identity.getPrincipal().getName()),并且我有这个命令可以为我提供特定用户的数据。我想你明白了。 我 运行 在我的 java 中执行此命令并手动检索我的数据。

这里是 Java 中的代码:


final String cmd = "ldapsearch -H " + ldapUrl + " -x -D \"" + ldapUser + "\" -w " + ldapPassword + " -b \"" + ldapFilter + "\" -LLL \"(uid=" + login + ")\"";
String[] shellCommand = { "/bin/bash", "-c", cmd };

final Map<String, String> map = new HashMap<>();

Process process = Runtime.getRuntime().exec(shellCommand);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

String line;
while ((line = reader.readLine()) != null) {
    if(line.contains(": ")) {
        final String key = line.split(": ")[0];
        final String value = line.split(": ")[1];

        map.put(key, value);
    }
}
return map;

请注意我每个键只得到一个值,因为我感兴趣的数据只有一行。

这是我为我的问题找到的答案。 我希望有人能找到更干净的东西。

托马斯