Programovanie

Zjednodušte prístup k adresáru pomocou jarného protokolu LDAP

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ť NamingExceptions a dostávam InitialContexts, 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 AttributeMappers 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ý
  1. 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, potom NoInitialContextException je hodená.
  2. 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áte ldap: //:.
  3. 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é.
  4. 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.
  5. 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 NamingExceptions 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í.

$config[zx-auto] not found$config[zx-overlay] not found