Programiranje

Poenostavite dostop do imenika s Spring LDAP

Spring LDAP je spomladanski okvir, ki poenostavlja programiranje LDAP na platformi Java. V tem vodniku po korakih za uporabo Spring LDAP boste izvedeli, kako ogrodje obravnava nizko nivojsko kodiranje, ki ga zahteva večina odjemalcev LDAP, tako da se lahko osredotočite na razvoj poslovne logike vaše aplikacije. Vadili boste tudi preproste operacije CRUD z uporabo Spring LDAP in se seznanili z naprednejšimi operacijami, kot sta ustvarjanje dinamičnih filtrov in pretvorba vnosov LDAP v zrna Java.

Lahek protokol za dostop do imenika je danes bistveni sestavni del večine uvedb velikih aplikacij v podjetju. LDAP se uporablja predvsem za shranjevanje informacij, povezanih z identiteto uporabnika, kot so uporabniško ime, geslo in e-poštni naslov. Uporablja se tudi v varnostnih izvedbah, kjer je treba uporabniške pravice dostopa shraniti za namene preverjanja pristnosti in avtorizacije.

Java Naming and Directory Interface (JDNI) je API, ki se uporablja za programiranje LDAP na platformi Java. Določa standardni vmesnik, ki se lahko uporablja v vaši aplikaciji za interakcijo s katerim koli strežnikom LDAP. Na žalost uporaba JNDI običajno vključuje pisanje veliko ponavljajoče se kode na nizki ravni. JNDI preveč dela s preprostimi postopki, na primer z zagotavljanjem pravilnega odpiranja in zapiranja virov. Poleg tega večina metod JNDI vrže preverjene izjeme, ki so dolgotrajne. Po natančnem pregledu se zdi, da je 50 do 60 odstotkov časa, porabljenega za programiranje JNDI, zapravljeno za izvajanje ponavljajočih se nalog.

Spring LDAP je odprtokodna knjižnica Java, zasnovana za poenostavitev programiranja LDAP na platformi Java. Tako kot Spring Framework odvzame velik del programiranja na nizki ravni iz razvoja aplikacij Java Enterprise, vas Spring LDAP osvobodi infrastrukturnih podrobnosti uporabe LDAP. Namesto da bi vas skrbelo NamingExceptions in pridobivanje InitialContextlahko se osredotočite na poslovno logiko aplikacije. Spring LDAP prav tako definira obsežno nepreverjeno hierarhijo izjem in nudi pomožne razrede za gradnjo filtrov LDAP in uglednih imen.

Pomlad LDAP in JNDI

Upoštevajte, da spomladanski okvir LDAP ne nadomešča JNDI. Namesto tega ponuja razrede ovitkov in pripomočkov prek JNDI za poenostavitev programiranja LDAP na platformi Java.

V tem članku, začetniškem priročniku za uporabo Spring LDAP, bom začel z razvojem preprostega programa JNDI za izvajanje iskanja LDAP. Nato bom pokazal, kako lažje je narediti isto z uporabo Spring LDAP ogrodja. Pokazal vam bom, kako uporabljati Spring LDAP AttributeMappers za preslikavo atributov LDAP v fižol Java in kako uporabiti njegove dinamične filtre za izdelavo poizvedb. Na koncu bom predstavil podroben uvod v uporabo Spring LDAP ogrodja za dodajanje, brisanje in spreminjanje podatkov v strežniku LDAP.

Upoštevajte, da ta članek predvideva, da poznate koncepte in terminologijo Spring Framework. Glejte razdelek Viri, če želite izvedeti več o Spring Framework, LDAP in JNDI ter prenesti vzorčno aplikacijo.

Preprost odjemalec JNDI

Seznam 1 prikazuje preprost program JNDI, ki bo natisnil datoteko cn atributi vseh Oseba vnesite predmete na konzolo.

Seznam 1. SimpleLDAPClient.java

javni razred 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, "preprosto"); env.put (Context.SECURITY_PRINCIPAL, "uid = admin, ou = sistem"); env.put (Context.SECURITY_CREDENTIALS, "skrivnost"); DirContext ctx = null; Rezultati NamingEnumeration = null; poskusite {ctx = new InitialDirContext (env); SearchControls control = new SearchControls (); controls.setSearchScope (SearchControls.SUBTREE_SCOPE); rezultati = ctx.search ("", "(objectclass = oseba)", kontrolniki); while (results.hasMore ()) {SearchResult searchResult = (SearchResult) results.next (); Atributi atributi = searchResult.getAttributes (); Atribut attr = attributes.get ("cn"); Niz cn = (Niz) attr.get (); System.out.println ("Skupno ime osebe =" + cn); }} catch (NamingException e) {vrzi novo RuntimeException (e); } končno {if (rezultati! = null) {poskusite {results.close (); } catch (Izjema e) {}} if (ctx! = null) {try {ctx.close (); } ulov (izjema e) {}}}}}

Prva stvar, ki sem jo naredil v seznamu 1, je ustvariti InitialDirContext objekt, ki se nato uporablja kot kontekst za naslednje imeniške operacije. Pri ustvarjanju novega Kontekst objekt Konfiguriram lastnosti, kot so uporabniško ime, geslo in mehanizem za preverjanje pristnosti, ki se lahko uporabljajo za povezavo s strežnikom LDAP. To mi je uspelo z ustvarjanjem Hashtable objekt, pri čemer vse te lastnosti nastavite kot pare ključ / vrednost v Hashtable in mimo Hashtable do InitialDirContext konstruktor.

Neposredna težava tega pristopa je, da sem vse konfiguracijske parametre trdo kodiral v datoteko .java. To v mojem primeru deluje dobro, v resnični aplikaciji pa ne. V resnični aplikaciji bi želel lastnosti povezave shraniti v datoteko jndi.properties in jo shraniti bodisi v učno pot mojega projekta bodisi v mapo / lib. Ob ustvarjanju novega InitialDirContext objekt, bi JNDI API na obeh mestih iskal datoteko jndi.properties, nato pa z njo ustvaril povezavo s strežnikom LDAP.

Konfiguracijski parametri JNDI

Seznam 2 prikazuje konfiguracijske parametre JNDI za povezavo z mojim strežnikom LDAP. Razlagam pomen parametrov spodaj.

Seznam 2. Konfiguracijski parametri JNDI za LDAP

java.naming.factory.initial = com.sun.jndi.ldap.LdapCtxFactory java.naming.provider.url = ldap: // localhost: 10389 / ou = system java.naming.security.authentication = simple java.naming.security .principal = uid = admin, ou = system java.naming.security.credentials = secret
  1. Kontekst.INITIAL_CONTEXT_FACTORY (java.naming.factory.inicial) mora biti enako popolnoma kvalificiranemu imenu razreda, ki bo uporabljeno za ustvarjanje novega začetnega konteksta. Če vrednost ni podana, potem NoInitialContextException je vržen.
  2. Kontekst.PROVIDER_URL (java.naming.provider.url) mora biti enak URL-ju strežnika LDAP, s katerim se želite povezati. Moral bi biti v formatu ldap: //:.
  3. Kontekst.SECURITY_AUTHENTICATION (java.naming.security.authentication) predstavlja vrsto avtentikacijskega mehanizma, ki ga želite uporabiti. V mojem primeru sem za preverjanje pristnosti uporabil uporabniško ime in geslo, zato je vrednost te lastnosti preprosto.
  4. Kontekst.SECURITY_PRINCIPAL (java.naimanje.varnost.principal) predstavlja ugledno uporabniško ime (DN), ki ga je treba uporabiti za vzpostavitev povezave.
  5. Context.SECURITY_CREDENTIALS (java.naming.security.credentials) predstavlja uporabniško geslo.

Koda odjemalca JNDI

Po pridobitvi Kontekst objekt moj naslednji korak je ustvariti SearchControl predmet, ki zajema dejavnike, ki določajo obseg mojega iskanja in kaj bo vrnjeno. Iskati želim celotno poddrevo, zakoreninjeno v kontekstu, zato sem obseg iskanja nastavil na SUBTREE_SCOPE s klicem na setSearchScope () metoda SearchControl, kot je bilo prej prikazano v seznamu 1.

Nato pokličem Iskanje() metoda DirContext, mimo (objektni razred = oseba) kot vrednost filtra. The Iskanje() metoda vrne a NamingEnumeration objekt, ki vsebuje vse vnose v poddrevesu Kontekst, kje objectclass je enako oseba. Po pridobitvi a NamingEnumeration kot moj rezultat rezultat, ga preletim in natisnem cn atribut za vsakega Oseba predmet.

S tem sem zaključil svojo razlago kode odjemalca JNDI. Če pogledate SimpleLDAPClient.java, prikazano na seznamu 1, lahko zlahka vidite, da gre več kot polovica kode za odpiranje in zapiranje virov. Druga težava z API-jem JNDI je, da večina njegovih metod vrže a NamingException ali enega od njegovih podrazredov v primeru napake. Ker NamingException je preverjena izjema, jo morate obvladati, če je vržena, vendar ali lahko resnično obnovite izjemo, če strežnik LDAP ne deluje? Ne, ne moreš.

Večina razvijalcev obide JNDI NamingExceptions preprostim ulovom in ničesar. Težava te rešitve je, da lahko izgubite pomembne informacije.

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