将Ldap用户与使用Java的组关联

Lea*_*niz 5 java jndi ldap active-directory

我在找到如何将#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();
    }
Run Code Online (Sandbox Code Playgroud)

我还尝试使用以下专有名称:"CN = Managers,OU = <system_name>,OU = Users,OU = <server>,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)
...
Run Code Online (Sandbox Code Playgroud)

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

use*_*421 5

如果您使用的是OpenLDAP,则memberOf属性会由memberOf叠加层自动维护,并且您的应用程序根本不应编写该属性。您应该做的是将用户的DN添加到他要加入的组的uniqueMemberor roleOccupant等属性中。然后,其DN将神奇地出现在他的memberOf属性中。

  • 这个答案是正确的,应该标记为那个。同样的问题的答案也证实了这一点:http://stackoverflow.com/questions/21147625/java-ldap-add-group-to-user-issue-error-code-53-will-not-perform (2认同)

hov*_*yan 0

您的 DN 很可能是错误的,因为您似乎指定了一个额外的组织单位而不是域组件:

"CN=Managers,OU=<system_name>,OU=Users,OU=<server>,DC=com"
Run Code Online (Sandbox Code Playgroud)

应该:

"cn=Managers,ou=<system_name>,ou=Users,dc=<server>,dc=com"
Run Code Online (Sandbox Code Playgroud)

在 LDAP 中,目录结构以 2 个域组件开始,它们是颠倒的公司域名(按照惯例)。

为了使您的代码正常工作,您必须考虑以下因素:

  • 您的 LDAP 服务器中加载了一个模式“Person”

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

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

我还鼓励您查看UnboundID LDAP SDK

希望有帮助。