首页 > 解决方案 > 无法访问 LdapUserDetailsMapper 中的所有 LDAP 属性

问题描述

我的 spring 应用程序有一个 ldap 身份验证。为了为我的 customUserDetails 添加特殊属性,我制作了一个CustomLdapUserDetailsMapper.

我需要搜索在我的 LDAP 中定义的用户角色。Ldap 的配置如下:一个特定的用户有一个 memberof 列表,它可以有一个memberof列表等。所以我需要浏览所有这棵树才能找到一个特定的组。

问题是我无法访问所有 LDAP。我只有用户的属性 DN,但我找不到memberof列表的属性。

这是我的 CustomLdapUserDetailsMapper :

@Component
public class CustomLdapUserDetailsMapper extends LdapUserDetailsMapper {

  @Override
  public CustomUserDetails mapUserFromContext(DirContextOperations ctx, String username,
        Collection<? extends GrantedAuthority> authorities) {
    UserDetails details = super.mapUserFromContext(ctx, username, authorities);
    CustomUserDetails user = new CustomUserDetails((LdapUserDetails) details);
    Attributes attributes = ctx.getAttributes();

    try {
        Attribute memberOf = attributes.get("memberOf");
        if (memberOf != null) {
            List<?> userGroups = Collections.list(memberOf.getAll());
            userGroups.forEach(group -> {
                String memberOfDn = group.toString();
                try {
                    DirContextAdapter subContext = new DirContextAdapter(memberOfDn);
                    Attributes subAttributes = subContext.getAttributes();
                    Attribute subMemberOf = subAttributes.get("memberOf");
                    List<?> subGroupsMemberOf = Collections.list(subMemberOf.getAll());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
    } catch (NamingException e) {
        e.printStackTrace();
    }

    return user;
  }
}

它在这里不起作用,子上下文不包含给定 DN 名称的属性。

你知道我是否可以memberof在 Mapper 中浏览我的列表的子属性树吗?

标签: springsecurityspring-securityldap

解决方案


您需要完全从 ldap 服务器管理员那里了解组 dn。您的用户不包含名为memberof的列表。你需要这样搜索;

AndFilter filter = new AndFilter();
        filter.and(new EqualsFilter("uid", userName));
        filter.and(new EqualsFilter("isMemberOf",
                CN=ADMIN,ou=users));
        List<?> userList = ldapTemplate.search(
                "ou=exampleUsers",
                filter.encode(),
                new CustomLdapUserDetailsMapper()
        );

如果从此搜索返回任何内容,则您确定您的用户是 ADMIN 的成员


推荐阅读