2012-07-04 15 views
5

#Ldapユーザーを特定のグループに関連付ける方法を見つけるのに問題があります。 「CN =マネージャ、OU = < SYSTEM_NAME>、OU =ユーザー、OUは= <サーバー>、DC:LdapユーザーをJavaグループに関連付けます

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(); 
    } 

私も同じよう識別名を使用しようとしました:私が試したものである

= 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) 
... 

これは私のアプリケーションのライン以外のすべてのスタックトレースです。

"cn=Managers,ou=<system_name>,ou=Users,dc=<server>,dc=com" 

はLDAPでのディレクトリ構造が始まる:

"CN=Managers,OU=<system_name>,OU=Users,OU=<server>,DC=com" 

は次のようになります。あなたの代わりにドメインコンポーネントの1つの余分組織単位を指定したと思われるので

+0

私はJNDIを使ってLDAPを操作していませんが、 'person'オブジェクトクラスに 'memberOf'属性がある場合、LDAPサーバーをチェックインしましたか?何に対して開発しているLDAPサーバーですか?いずれの場合も、 'memberOf'の完全DNを指定する必要があります。 – hovanessyan

+0

これを試してみましたが、問題を再現できます。 'memberOf'属性が存在し、DNが正しい。しかし、ここでの主な問題は、ユーザーをグループに追加することは、ユーザーオブジェクトではなくグループオブジェクトから行われることです(@EJPは以下でコメントしました)。 –

答えて

0

おそらくあなたのDNは、間違っています2つのドメインコンポーネントがあり、これは逆の企業ドメイン名です(規約上)。

  • は属性「のMemberOfあります

  • あなたのLDAPサーバにロードされたのスキーマ「人」があります:あなたのコードが動作するためには

    、次の考慮に入れる必要があり人 "スキーマ

  • "のMemberOf "あなたの中で定義された"" エントリとして、完全なDNが必要です

UnboundID LDAP SDKもご覧ください。

希望に役立ちます。

0

memberOf属性の値が正しくありません。 memberOf属性はおそらく識別名です。 LDAPクライアントは、属性の構文、順序付け、または一致の規則が疑わしい場合は、スキーマ(root DSEで使用可能な基本DN)を参照する必要があります。

+0

ありがとうございますが、私も識別名を使用しようとしましたが、baseDnを省略しましたが、ここにはあります: 'String baseDn =" OU = Delphos、OU = Users、OU = Nextel、DC = tades、DC = com、DC = br "'; これは、私が使用している両方の識別名です: 'memberOf.add(" CN = Gestores、OU = Delphos、OU =ロール、OU = Nextel、DC =タード、DC = com、DC = br "); 私はLdapサーバーで作成されたロールとユーザーを持っていますが、このロールは、 。私は属性 "memberOf"を作成しました。それを省略しようとすると、エラーが「属性変換操作のエラー、データ0、v1db1」に変更されます。 –

3

OpenLDAPを使用している場合、memberOf属性はmemberOfオーバーレイによって自動的に維持され、アプリケーションはまったく書き込むべきではありません。あなたがしなければならないことは、参加しているグループのuniqueMemberまたはroleOccupantなどの属性にユーザーのDNを追加することです。そのDNは、そのmemberOf属性に魔法のように表示されます。

+1

この回答は正しいので、それをマークする必要があります。この非常に同じ質問に対する答えでも同様に確認されています:http://stackoverflow.com/questions/21147625/java-ldap-add-group-to-user-issue-error-code-53-will-not-perform –

-1

私は同じ問題を抱えていました。 ldapのクライアントを使用して、この属性の値のタイプを確認します(Apache Directory Studioなど)。 String型の属性をint値に置き換えると、このエラーがスローされます。

関連する問題