【问题标题】:could not access to all LDAP Attributes in LdapUserDetailsMapper无法访问 LdapUserDetailsMapper 中的所有 LDAP 属性
【发布时间】:2021-03-16 17:31:23
【问题描述】:

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

我需要搜索在我的 LDAP 中定义的用户角色。 Ldap 的配置如下:一个特定的用户有一个成员列表,它可以有一个 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 名称的属性。

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

【问题讨论】:

    标签: spring security spring-security ldap


    【解决方案1】:

    您需要完全从 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 的成员

    【讨论】:

      猜你喜欢
      • 2011-11-12
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 2014-09-19
      • 2014-11-21
      • 2017-06-10
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多