Jarný LDAP je jarný rámec, ktorý zjednodušuje programovanie LDAP na platforme Java. V tomto podrobnom sprievodcovi používaním Spring LDAP sa dozviete, ako framework spracováva nízkoúrovňové kódovanie vyžadované väčšinou klientov LDAP, aby ste sa mohli sústrediť na vývoj obchodnej logiky vašej aplikácie. Precvičíte si tiež jednoduché operácie CRUD pomocou Spring LDAP a dozviete sa viac o pokročilejších operáciách, ako je vytváranie dynamických filtrov a prevádzanie položiek LDAP na Java fazuľa.
Ľahký adresárový prístupový protokol je základnou súčasťou väčšiny rozsiahlych nasadení podnikových aplikácií v súčasnosti. Protokol LDAP sa primárne používa na ukladanie informácií týkajúcich sa totožnosti používateľa, ako napríklad používateľské meno, heslo a e-mailová adresa používateľa. Používa sa tiež v bezpečnostných implementáciách, kde je potrebné ukladať prístupové práva používateľov na účely autentifikácie a autorizácie.
Java Naming and Directory Interface (JDNI) je API používané na programovanie LDAP na platforme Java. Definuje štandardné rozhranie, ktoré je možné vo vašej aplikácii použiť na interakciu s ľubovoľným serverom LDAP. Bohužiaľ, použitie JNDI zvyčajne znamená písanie veľkého množstva opakujúcich sa kódov na nízkej úrovni. JNDI príliš veľa pracuje s jednoduchými postupmi, ako je napríklad zabezpečenie správneho otvorenia a zatvorenia zdrojov. Väčšina metód JNDI navyše vyvoláva kontrolované výnimky, ktorých spracovanie je časovo náročné. Po dôkladnej kontrole sa zdá, že 50 až 60 percent času stráveného programovaním JNDI sa míňa na spracovanie opakujúcich sa úloh.
Spring LDAP je open source knižnica Java navrhnutá na zjednodušenie programovania LDAP na platforme Java. Rovnako ako jarný rámec z vývoja podnikových aplikácií Java odoberá väčšinu programovania na nízkej úrovni, aj jarný LDAP vás zbaví infraštruktúrnych detailov používania LDAP. Skôr ako sa trápiť NamingException
s a dostávam InitialContext
s, môžete sa sústrediť na obchodnú logiku svojej aplikácie. Jarný LDAP tiež definuje komplexnú nekontrolovanú hierarchiu výnimiek a poskytuje pomocné triedy na vytváranie filtrov LDAP a rozlišujúcich mien.
Jarné LDAP a JNDI |
---|
Upozorňujeme, že jarný rámec LDAP nenahrádza JNDI. Poskytuje skôr obálky a triedy nástrojov cez JNDI, aby zjednodušil programovanie LDAP na platforme Java. |
V tomto článku, sprievodcovi pre začiatočníkov používajúcim Spring LDAP, začnem vývojom jednoduchého programu JNDI na vykonávanie vyhľadávania LDAP. Potom ukážem, o koľko jednoduchšie je to isté urobiť pomocou jarného rámca LDAP. Ukážem vám, ako používať jarné LDAP AttributeMapper
s na mapovanie atribútov LDAP na fazuľa Java a na to, ako používať jej dynamické filtre na vytváranie dotazov. Na záver uvediem podrobný úvod do používania jarného rámca LDAP na pridávanie, odstraňovanie a úpravu údajov na vašom serveri LDAP.
Upozorňujeme, že tento článok predpokladá, že ste oboznámení s koncepciami a terminológiou jarného rámca. V sekcii Zdroje sa dozviete viac o Spring Framework, LDAP a JNDI, ako aj o stiahnutí vzorovej aplikácie.
Jednoduchý klient JNDI
Zoznam 1 zobrazuje jednoduchý program JNDI, ktorý vytlačí súbor cn atribúty všetkých Osoba
zadajte objekty na svojej konzole.
Zoznam 1. SimpleLDAPClient.java
public class SimpleLDAPClient {public static void main (String [] args) {Hashtable env = new Hashtable (); env.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put (Context.PROVIDER_URL, "ldap: // localhost: 10389 / ou = system"); env.put (Context.SECURITY_AUTHENTICATION, "jednoduché"); env.put (Context.SECURITY_PRINCIPAL, "uid = admin, ou = systém"); env.put (Context.SECURITY_CREDENTIALS, "tajomstvo"); DirContext ctx = null; NamingEnumeration results = null; try {ctx = new InitialDirContext (env); Ovládacie prvky SearchControls = nové SearchControls (); controls.setSearchScope (SearchControls.SUBTREE_SCOPE); results = ctx.search ("", "(objectclass = person)", ovládacie prvky); while (results.hasMore ()) {SearchResult searchResult = (SearchResult) results.next (); Atribúty attribute = searchResult.getAttributes (); Atribút attr = attributes.get ("cn"); Reťazec cn = (Reťazec) attr.get (); System.out.println ("Bežné meno osoby =" + cn); }} catch (NamingException e) {hod novy RuntimeException (e); } nakoniec {if (results! = null) {try {results.close (); } catch (Výnimka e) {}} if (ctx! = null) {try {ctx.close (); } úlovok (Výnimka e) {}}}}}
Prvá vec, ktorú som urobil v zozname 1, je vytvorenie InitialDirContext
objekt, ktorý sa potom použije ako kontext pre nasledujúce operácie s adresármi. Pri vytváraní nového Kontext
objekt Konfigurujem vlastnosti ako používateľské meno, heslo a autentifikačný mechanizmus, ktorý je možné použiť na pripojenie k serveru LDAP. Podarilo sa mi to vytvorením Hashtable
objekt, nastavenie všetkých týchto vlastností ako párov kľúč / hodnota v Hashtable
a absolvovanie Hashtable
do InitialDirContext
konštruktér.
Okamžitým problémom tohto prístupu je, že som všetky parametre konfigurácie napevno naprogramoval do súboru .java. Pre môj príklad to funguje dobre, ale nie pre aplikáciu v reálnom svete. V aplikácii v reálnom svete by som chcel uložiť vlastnosti pripojenia do súboru jndi.properties a umiestniť tento súbor buď do priečinka triedy projektu alebo do jeho priečinka / lib. Po vytvorení nového InitialDirContext
objekt, API JNDI vyhľadá na oboch týchto miestach súbor jndi.properties a potom ho použije na vytvorenie pripojenia k serveru LDAP.
Konfiguračné parametre JNDI
Výpis 2 zobrazuje konfiguračné parametre JNDI pre pripojenie k môjmu serveru LDAP. Ďalej vysvetľujem význam parametrov.
Zoznam 2. Konfiguračné parametre JNDI pre LDAP
java.naming.factory.initial = com.sun.jndi.ldap.LdapCtxFactory java.naming.provider.url = ldap: // localhost: 10389 / ou = systém java.naming.security.authentication = jednoduchá java.naming.security .principal = uid = admin, ou = systém java.naming.security.credentials = tajný
- Context.INITIAL_CONTEXT_FACTORY (
java.naming.factory.initial
) by sa mal rovnať plne kvalifikovanému názvu triedy, ktorý sa použije na vytvorenie nového počiatočného kontextu. Ak nie je zadaná žiadna hodnota, potomNoInitialContextException
je hodená. - Kontext.PROVIDER_URL (
java.naming.provider.url
) by sa mala rovnať adrese URL servera LDAP, ku ktorému sa chcete pripojiť. Malo by to byť vo formáteldap: //:
. - Kontext.SECURITY_AUTHENTICATION (
java.naming.security.authentication
) predstavuje typ autentifikačného mechanizmu, ktorý chcete použiť. V mojom príklade som použil používateľské meno a heslo na autentifikáciu, takže hodnota tejto vlastnosti je jednoduché. - Kontext.SECURITY_PRINCIPAL (
java.pomenovanie.bezpečnosť.principal
) predstavuje rozlišujúce používateľské meno (DN), ktoré by sa malo použiť na nadviazanie spojenia. - Kontext.SECURITY_CREDENTIALS (
java.naming.security.credentials
) predstavuje heslo používateľa.
Kód klienta JNDI
Po získaní Kontext
mojím ďalším krokom je vytvoriť a SearchControl
objekt, ktorý obsahuje faktory, ktoré určujú rozsah môjho vyhľadávania a čo sa vráti. Chcem prehľadať celý podstrom zakorenený v kontexte, takže som nastavil rozsah hľadania na SUBTREE_SCOPE
zavolaním na setSearchScope ()
metóda SearchControl
, ako už bolo uvedené v zozname 1.
Ďalej volám Vyhľadávanie()
metóda DirContext
, prechádzajúc dovnútra (trieda objektov = osoba)
ako hodnota filtra. The Vyhľadávanie()
metóda vráti a NamingEnumeration
objekt obsahujúci všetky položky v podstromu Kontext
, kde trieda objektov
rovná sa osoba
. Po získaní a NamingEnumeration
ako môj výsledný objekt prechádzam iteráciou a tlačím a cn atribút pre každého Osoba
objekt.
Týmto je moje vysvetlenie kódu klienta JNDI dokončené. Pri pohľade na SimpleLDAPClient.java, ktorý je uvedený v zozname 1, môžete ľahko zistiť, že viac ako polovica kódu smeruje k otváraniu a zatváraniu zdrojov. Ďalším problémom rozhrania JNDI API je, že väčšina jeho metód vyvolá a NamingException
alebo jednej z jeho podtried v prípade chyby. Pretože NamingException
je kontrolovaná výnimka, musíte ju zvládnuť, ak je vyhodená, ale môžete sa skutočne zotaviť z výnimky, ak je váš server LDAP nefunkčný? Nie, nemôžeš.
Väčšina vývojárov obchádza JNDI NamingException
s tým, že ich jednoducho chytíte a nič neurobíte. Problém s týmto riešením je, že môže spôsobiť stratu dôležitých informácií.