【问题标题】:Associate Ldap user to a group with Java使用 Java 将 Ldap 用户与组关联
【发布时间】: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=,OU=Users,OU=,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)
...

这是除了我的应用程序行之外的所有堆栈跟踪。

【问题讨论】:

  • 我没有使用 JNDI 来处理 LDAP,但是如果 'person' 对象类具有 'memberOf' 属性,您是否检查了您的 LDAP 服务器?您正在开发的 LDAP 服务器是什么?在任何情况下,您都必须为“memberOf”指定完整的 DN。
  • 我现在尝试了同样的方法只是为了测试它并且可以重现问题。 'memberOf' 属性确实存在并且 DN 是正确的。但是我认为这里的主要问题是应该从组对象而不是用户对象中将用户添加到组中(正如@EJP 在下面进一步评论的那样)。

标签: java active-directory ldap jndi


【解决方案1】:

如果您使用 OpenLDAP,memberOf 属性由 memberOf 覆盖自动维护,您的应用程序根本不应该编写它。您应该做的是将用户的 DN 添加到他正在加入的组的 uniqueMemberroleOccupant 等属性中。然后它的 DN 会神奇地出现在他的memberOf 属性中。

【讨论】:

【解决方案2】:

您的 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”

  • 在您的“Person”架构中定义了一个属性“MemberOf”

  • “MemberOf”需要完整的 DN 作为条目

我也鼓励你看看UnboundID LDAP SDK

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    memberOf 属性的值错误。 memberOf 属性可能是一个专有名称。当对属性的语法、排序或匹配规则有疑问时,LDAP 客户端应查阅模式(其基本 DN 可能在 root DSE 中可用)。

    【讨论】:

    • 谢谢,但我也尝试使用专有名称,我省略了 baseDn,但这里是:String baseDn = "OU=Delphos,OU=Users,OU=Nextel,DC=tades,DC=com,DC=br";这是我正在使用的两个专有名称:memberOf.add("CN=Gestores,OU=Delphos,OU=Roles,OU=Nextel,DC=tades,DC=com,DC=br"); memberOf.add("CN=Administradores,OU=Delphos,OU=Roles,OU=Nextel,DC=tades,DC=com,DC=br"); 我有在 Ldap 服务器中创建的模式角色和用户。我还创建了属性“memberOf”,当我尝试省略它时,错误更改为Error in attribute conversion operation, data 0, v1db1
    【解决方案4】:

    我遇到了同样的问题。使用 ldap 的任何客户端(例如:Apache Directory Studio)检查此属性的值类型。如果您尝试将类型为 String 的属性替换为 int 值,则会引发此错误。

    【讨论】:

    • int 的价值是什么? OP中没有提到这样的事情。
    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2011-11-11
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多