我的spring应用程序有一个ldap身份验证。为了为我的customUserDetails添加特殊属性,我制作了一个CustomLdapUserDetailsMapper
。
我需要在LDAP中搜索用户角色定义。Ldap的配置如下:一个特定的用户有一个memberof-list,它可以有一个memberof
lists to,等等。所以我需要浏览所有这棵树才能找到一个特定组。
问题是我无法访问所有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;
}
}
它在这里不起作用,subContext不包含给定DN名称的属性。
你知道我是否可以在Mapper中浏览我的memberof
列表的子属性树吗?
您需要从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 的成员