6

#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>,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)
...

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

4

4 に答える 4

7

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

于 2012-07-05T18:50:57.237 に答える
0

ドメインコンポーネントの代わりに1つの追加の組織単位を指定したように見えるため、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を必要とします

また、 UnboundIDLDAPSDKを確認することをお勧めします。

お役に立てば幸いです。

于 2012-07-04T15:02:58.947 に答える
0

属性の値memberOfが間違っています。memberOf属性はおそらく識別名です。LDAP クライアントは、属性の構文、順序付け、または一致規則について疑問がある場合、スキーマ (ルート DSEで利用可能なベース DN) を参照する必要があります。

于 2012-07-05T09:52:40.190 に答える
-1

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

于 2013-07-31T09:01:53.167 に答える