【发布时间】:2012-07-04 23:11:16
【问题描述】:
我在查找如何将 #Ldap 用户与给定组关联时遇到问题。
这是我尝试过的:
Attributes attrs = new BasicAttributes();
BasicAttribute basicAttrs = new BasicAttribute("objectclass");
basicAttrs.add("top");
basicAttrs.add("person");
BasicAttribute memberOf = new BasicAttribute("memberOf");
memberOf.add("Managers"); // Tried with distinguished name too
memberOf.add("Administrators"); // Tried with distinguished name too
attrs.put(basicAttrs);
attrs.put("cn", user.getLogin());
attrs.put("name", user.getLogin());
attrs.put("login", user.getLogin());
attrs.put("mail", user.getMail());
attrs.put("displayName", user.getDisplayName());
attrs.put("memberOf", memberOf);
try {
ctx.bind("CN=" + user.getLogin() + "," + baseDn, null, attrs);
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
我还尝试使用专有名称,例如:“CN=Managers,OU=
但是我收到了这个错误:
javax.naming.directory.InvalidAttributeValueException: Malformed 'memberOf' attribute value; remaining name 'CN=lcarvalho,OU=<system_name>,OU=Users,OU=<server>,DC=com'
at com.sun.jndi.ldap.LdapClient.encodeAttribute(LdapClient.java:951)
at com.sun.jndi.ldap.LdapClient.add(LdapClient.java:999)
at com.sun.jndi.ldap.LdapCtx.c_bind(LdapCtx.java:396)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_bind(ComponentDirContext.java:277)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.bind(PartialCompositeDirContext.java:197)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.bind(PartialCompositeDirContext.java:186)
at javax.naming.directory.InitialDirContext.bind(InitialDirContext.java:158)
...
这是除了我的应用程序行之外的所有堆栈跟踪。
【问题讨论】:
-
我没有使用 JNDI 来处理 LDAP,但是如果 'person' 对象类具有 'memberOf' 属性,您是否检查了您的 LDAP 服务器?您正在开发的 LDAP 服务器是什么?在任何情况下,您都必须为“memberOf”指定完整的 DN。
-
我现在尝试了同样的方法只是为了测试它并且可以重现问题。 'memberOf' 属性确实存在并且 DN 是正确的。但是我认为这里的主要问题是应该从组对象而不是用户对象中将用户添加到组中(正如@EJP 在下面进一步评论的那样)。
标签: java active-directory ldap jndi