我在找到如何将#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 =< system_name&gt ;, OU = Users,OU =< server&gt ;, DC = com”,但不起作用。 我认为它应该在某个地方引用Ldap组。
但我收到了这个错误:
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)
...
除了我的应用程序行之外,这是所有堆栈跟踪。
答案 0 :(得分:3)
如果您正在使用OpenLDAP,memberOf覆盖会自动维护memberOf属性,您的应用程序根本不应该写它。您应该做的是将用户的DN添加到他正在加入的组的uniqueMember或roleOccupant等属性中。然后它的DN将神奇地出现在他的memberOf属性中。
答案 1 :(得分:0)
很可能你的DN错了,因为你似乎已经指定了一个额外的组织单位而不是域组件:
"CN=Managers,OU=<system_name>,OU=Users,OU=<server>,DC=com"
应该是:
"cn=Managers,ou=<system_name>,ou=Users,dc=<server>,dc=com"
在LDAP中,目录结构以2个域组件开头,这两个域组件是反向公司域名(按照惯例)。
为了使您的代码有效,您必须考虑以下因素:
在LDAP服务器中加载了一个模式“Person”
在“人员”架构中定义了“MemberOf”属性
“MemberOf”需要完整的DN作为条目
我还建议您查看UnboundID LDAP SDK。
希望有所帮助。
答案 2 :(得分:0)
memberOf
属性的值是错误的。 memberOf
属性可能是一个可分辨的名称。如果对属性的语法,排序或匹配规则有疑问,LDAP客户端应查阅模式(root DSE中可能提供的基本DN)。
答案 3 :(得分:-1)
我遇到了同样的问题。使用ldap的任何客户端检查此属性的值类型(例如:Apache Directory Studio)。如果您尝试使用int值替换String类型的属性,则会抛出此错误。