Cześć! Kilka dni temu było mi miło poznać pewną ważną osobistość w świecie baz danych, usług katalogowych i szeroko pojętego gromadzenia informacji… A mowa oczywiście o LDAPie.
Czym jest LDAP? W skrócie jest to nieco inna baza danych.. Określana jako „lekka”, co w tym znaczeniu jest nie tyle szybkością (której w sumie LDAPowi nie brakuje), ile prostotą działania. Akronim po rozwinięciu to „Lighweight Directory Access Protocol”.
Czym różni się ona od standardowych baz SQL? Ano chociażby adresowaniem rekordów. W chociażby MySqlu, czy MsSql’u – rekordy posiadają unikalne pole, dzięki któremu możemy się do nich dobrać. Tzw. Primary Key. Często jest to również pole odpowiadające za numerację rekordów (auto increment).
W LDAPie jest nieco inaczej. Coś takiego jak Primary Key nie istnieje. Są za to jego odpowiedniki, które działają nieco inaczej. Jednym z nich jest DN czyli „distinguished name” – ścieżka, która wyróżnia rekord. Dzięki niej można się odwołać się do konkretnego rekordu. Alternatywą dla DN jest RDN – czyli relative DN, co w sumie jest tym samym, tylko że relatywnym (odnoszącym się do elementu nadrzędnego).
Przykładowa ścieżka:
„cn=mmazur,dc=eu,dc=org”
Jak widać ścieżka to zbiór elementów typu „klucz=wartość”, gdzie:
cn – to nazwa rekordu. Common name.
dc – directory context. Czyli dalsza część członu.
ou – organizational unit.
Natomiast sama końcówka to base distingushed name (BDN). U nas to „dc=mmazur,dc=eu,dc=org”.
Cały LDAP jest tak naprawdę implementacja struktury drzewiastej. Machnąłem (inaczej nie da się tego nazwać) mały szkic jak mogłaby by wyglądać struktura usługi katalogowej LDAP, gdyby chodziło o domenę http://mmazur.eu.org :
Jest to tylko przykład. Kontener (rożne są nazewnictwa, może to być również poddrzewem) cn=”mmazur” ma swoje atrybuty. Tutaj są to np DNS, właściciel itp. Do atrybutów możemy się odwołać poprzez ścieżkę RDN/DN. Ważną właściwością jest to, że struktura każdego rekordu może być inna – co nie jest możliwe w przypadku SQLa, tam każdy rekord ma z góry ustaloną strukturę (narzuconą przez strukturę tabeli).
Co ma do LDAP’a Java? Ano przyszło mi się zmierzyć z nim własnie w Javie. Autoryzacja + wybranie jakiś atrybutów. Trywialnie brzmiące zadanie nie było takie trywialne dla osoby która pierwszy raz w życiu zaczyna poznawać LDAPa.
Dla przykładu opiszę trochę jak odbywa się poleceni bind() – czyli autoryzacja.
W Javie są chyba 4 biblioteki do LDAPa – ja używałem JNDI.
Sama autoryzacja wygląda tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Hashtable<String,String> env = new Hashtable<String,String>(); env.put( Context.INITIAL_CONTEXT_FACTORY , "com.sun.jndi.ldap.LdapCtxFactory" ); env.put( Context.SECURITY_AUTHENTICATION , "simple" ); env.put( Context.PROVIDER_URL , "ldap://127.0.0.1:389/" ); //port default - 389 lub 636. env.put( Context.SECURITY_PRINCIPAL , "cn=mmazur,dc=eu,dc=org" ); env.put( Context.SECURITY_CREDENTIALS , "veryStrongPassword"); try { ctx = new InitialLdapContext( env, null ); //ctx od context ;) jesli nie walneło wyjątkkiem - autoryzacja się powiodła. ) catch( NamingException ex ) { //if auth failed. } |
Tworzymy na początku środowisko pracy w formie HashTablicy, typu klucz-wartość, uzupełniając tym samym dane potrzebne do autoryzacji. Podajemy typ autoryzacji, położenie serwera, port, ścieżkę i hasło. Jeśli uda się stworzyć kontekst środowiska, to znaczy że autoryzacja przebiegła bezproblemowo. Jeśli nie, dostaniemy wyjątek z Message typu „You don’t have permission.”
Mateusz Mazurek
Plus za fajny temat, minus za przykłady w Javie. :P
Dzięki wielkie za fragment kodu, mega przydatne ;)