2012-07-04 13 views
5

Mam problem ze znalezieniem sposobu powiązania użytkownika #Ldap z daną grupą.Powiąż użytkownika Ldap z grupą z Javą

To co próbowałem:

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

Próbowałem też używać nazw wyróżniających jak: „cn = Menedżerów, OU = < system_name>, OU = Użytkownicy, OU = < serwerów> DC = com ", ale nie działa. Myślę, że powinno być gdzieś odwołać się do grupy Ldap.

Ale mam ten błąd:

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

To wszystko ślad stosu oprócz moich linii aplikacyjnych.

+0

Nie użyłem JNDI do pracy z LDAP, ale czy sprawdziłeś na swoim serwerze LDAP, czy klasa obiektu "osoba" ma atrybut "memberOf"? Na czym polega serwer LDAP, nad którym pracujesz? W każdym przypadku musisz podać pełną nazwę DN dla "memberOf". – hovanessyan

+0

Próbowałem tego samego teraz tylko ze względu na testowanie tego i mogę odtworzyć problem. istnieje atrybut "memberOf", a nazwa DN jest poprawna. Ale myślę, że głównym problemem jest to, że dodanie użytkownika do grupy powinno nastąpić z obiektu grupy, a nie obiektu użytkownika (tak jak @EJP skomentowano dalej poniżej). –

Odpowiedz

0

Najprawdopodobniej Twój DN jest źle, ponieważ wydaje się, że podano jedną dodatkową jednostkę organizacyjną zamiast składnika domeny:

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

powinno być:

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

W LDAP zaczyna struktura katalogów z 2 komponentami domeny, które są odwróconą nazwą domeny firmy (według konwencji).

Aby Twój kod do pracy, trzeba wziąć pod uwagę następujące elementy:

  • istnieje schemat „Osoba”, który jest załadowany na serwerze LDAP

  • jest atrybutem „MemberOf "zdefiniowane w "osoba" schematu

  • "memberOf" wymaga pełnego DN jako wejścia

Zachęcam również do zapoznania się z UnboundID LDAP SDK.

Nadzieję, że pomaga.

0

Wartość atrybutu memberOf jest niepoprawna. Atrybut memberOf jest prawdopodobnie nazwą wyróżniającą. Klienci LDAP powinni zapoznać się ze schematem (którego podstawowa nazwa wyróżniająca może być dostępna w root DSE) w razie wątpliwości dotyczących składni, kolejności lub reguł dopasowania atrybutu.

+0

Dziękuję, ale starałem się również używać nazw wyróżniających, pominąłem baseDn, ale tutaj jest: 'String baseDn =" OU = Delphos, OU = Użytkownicy, OU = Nextel, DC = tades, DC = com, DC = br "; I tu są dwie nazwy, których używam: 'memberOf.add (" CN = Gestores, OU = Delphos, OU = Role, OU = Nextel, DC = tades, DC = com, DC = br "); memberOf.add ("CN = Administradores, OU = Delphos, OU = role, OU = Nextel, DC = tades, DC = com, DC = br"); ' Mam schematy Role i Użytkownicy utworzeni na serwerze Ldap . Mam również atrybut "memberOf", gdy próbuję go pominąć, błąd zmienia się na 'Błąd operacji konwersji atrybutów, dane 0, v1db1' –

3

Jeśli używasz OpenLDAP, atrybut memberOf jest automatycznie utrzymywany przez nakładkę memberOf, a twoja aplikacja nie powinna go w ogóle pisać. Powinieneś zrobić to dodając DN użytkownika do atrybutu uniqueMember lub roleOccupant etc w grupie, do której się przyłącza. Wtedy jego DN będzie magicznie pojawiać się w jego atrybut memberOf.

+1

Ta odpowiedź jest poprawna i powinna być oznaczona jako. Potwierdza to również odpowiedź na to samo pytanie: http://stackoverflow.com/questions/21147625/java-ldap-add-group-to-user-issue-error-code-53-will-not-perform –

-1

Miałem ten sam problem. Sprawdź typ wartości tego atrybutu za pomocą dowolnego klienta programu ldap (na przykład: Apache Directory Studio). Jeśli spróbujesz zastąpić atrybut, który jest typem String z wartością int, to zgłoszą ten błąd.