Mateusz Mazurek – programista z pasją

Python, architektura, ciekawostki ze świata IT

Programowanie

LDAP – zarys tematu [Java]

Cześć! Cieszę się, że mnie odwiedziłeś/aś. Zanim przejdziesz do artykułu chciałbym zwrocić Ci uwagę na to, że ten artykuł był pisany kilka lat temu (2013-09-12) miej więc proszę na uwadzę że rozwiązania i przemyślenia które tu znajdziesz nie muszą być aktualne. Niemniej jednak zachęcam do przeczytania.

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 :

LDAP

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

Dzięki za wizytę,
Mateusz Mazurek

A może wolisz nowości na mail?

Subskrybuj
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

2 komentarzy
Inline Feedbacks
View all comments
Enforcer

Plus za fajny temat, minus za przykłady w Javie. :P

Dzięki wielkie za fragment kodu, mega przydatne ;)