Programavimas

Supaprastinkite katalogų prieigą naudodami „Spring LDAP“

Pavasario LDAP yra pavasarinė sistema, supaprastinanti LDAP programavimą „Java“ platformoje. Išsamiame „Spring LDAP“ naudojimo vadove sužinosite, kaip sistema tvarko žemo lygio kodavimą, reikalingą daugumai LDAP klientų, kad galėtumėte susitelkti kurdami savo programos verslo logiką. Jūs taip pat praktikuosite paprastas CRUD operacijas naudodami „Spring LDAP“ ir sužinosite apie pažangesnes operacijas, tokias kaip dinaminių filtrų kūrimas ir LDAP įrašų pavertimas „Java“ pupelėmis.

„Lightweight Directory Access Protocol“ yra esminis daugelio didelio masto įmonių programų diegimo komponentas šiandien. LDAP pirmiausia naudojamas saugoti informaciją, susijusią su vartotojo tapatybe, pvz., Vartotojo vardą, slaptažodį ir el. Pašto adresą. Jis taip pat naudojamas diegiant saugumą, kai autentifikavimo ir prieigos tikslais būtina saugoti vartotojo prieigos teises.

„Java Naming and Directory Interface“ (JDNI) yra API, naudojama LDAP programavimui „Java“ platformoje. Tai apibrėžia standartinę sąsają, kurią galima naudoti jūsų programoje sąveikaujant su bet kuriuo LDAP serveriu. Deja, naudojant JNDI paprastai reikia parašyti daug žemo lygio, pasikartojančio kodo. JNDI dirba per daug paprastų procedūrų, pavyzdžiui, užtikrina, kad ištekliai būtų tinkamai atidaryti ir uždaryti. Be to, dauguma JNDI metodų išmeta patikrintas išimtis, kurias tvarkyti reikia daug laiko. Atidžiai patikrinus, atrodo, kad 50–60 procentų laiko, sugaišto JNDI programavimui, sugaištama kartotinėms užduotims tvarkyti.

„Spring LDAP“ yra atviro kodo „Java“ biblioteka, skirta supaprastinti LDAP programavimą „Java“ platformoje. Panašiai kaip „Spring Framework“ iš Java įmonės programų kūrimo atima daug žemo lygio programų, „Spring LDAP“ išlaisvina jus nuo LDAP naudojimo infrastruktūros detalių. Užuot jaudinęsis „NamingException“s ir vis InitialContexts, galite laisvai susitelkti ties savo programos verslo logika. Pavasario LDAP taip pat apibrėžia išsamią netikrinamą išimčių hierarchiją ir pateikia pagalbininkų klases LDAP filtrams ir atskiriems pavadinimams kurti.

Pavasario LDAP ir JNDI

Atkreipkite dėmesį, kad pavasario LDAP sistema nepakeičia JNDI. Atvirkščiai, jis teikia pakavimo ir naudingumo klases per JNDI, kad supaprastintų LDAP programavimą „Java“ platformoje.

Šiame straipsnyje, pradedančiųjų vadove „Spring LDAP“ naudojimui, pradėsiu nuo paprastos JNDI programos, skirtos atlikti LDAP paiešką, sukūrimo. Tada aš pademonstruosiu, kiek lengviau tą patį padaryti naudojant „Spring LDAP“ sistemą. Aš jums parodysiu, kaip naudoti „Spring LDAP“ „AttributeMapper“s susieti LDAP atributus su Java pupelėmis ir kaip naudoti dinaminius filtrus užklausoms kurti. Galiausiai pateiksiu išsamų įvadą, kaip naudoti „Spring LDAP“ sistemą norint pridėti, ištrinti ir modifikuoti duomenis jūsų LDAP serveryje.

Atkreipkite dėmesį, kad šiame straipsnyje daroma prielaida, kad esate susipažinę su „Spring Framework“ sąvokomis ir terminologija. Norėdami sužinoti daugiau apie „Spring Framework“, LDAP ir JNDI bei atsisiųsti pavyzdinę programą, žr. Skyrių „Ištekliai“.

Paprastas JNDI klientas

1 sąraše rodoma paprasta JNDI programa, kuri atsispausdins cn visų atributų Asmuo įveskite objektus savo konsolėje.

Sąrašas 1. SimpleLDAPClient.java

viešoji klasė SimpleLDAPClient {public static void main (String [] args) {Hashtable env = new Hashtable (); env.put (kontekstas.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put (kontekstas.PROVIDER_URL, "ldap: // localhost: 10389 / ou = sistema"); env.put (kontekstas.SECURITY_AUTHENTICATION, „paprasta“); env.put (kontekstas.SECURITY_PRINCIPAL, "uid = admin, ou = sistema"); env.put (kontekstas.SECURITY_CREDENTIALS, „paslaptis“); DirContext ctx = null; NameingEnumeration results = null; pabandykite {ctx = new InitialDirContext (env); „SearchControls“ valdikliai = naujas „SearchControls“ (); controls.setSearchScope (SearchControls.SUBTREE_SCOPE); rezultatai = ctx.search ("", "(objektų klasė = asmuo)", valdikliai); while (results.hasMore ()) {SearchResult searchResult = (SearchResult) results.next (); Atributų atributai = searchResult.getAttributes (); Atributas attr = attributes.get ("cn"); Stygos cn = (String) attr.get (); System.out.println ("Asmens bendras vardas =" + cn); }} gaudyti (NamingException e) {mesti naują RuntimeException (e); } pagaliau {if (rezultatai! = null) {pabandykite {rezultatus.close (); } pagauti (e išimtis) {}} if (ctx! = null) {pabandykite {ctx.close (); } sugavimas (e išimtis) {}}}}}

Pirmas dalykas, kurį padariau 1 sąraše, yra sukurti InitialDirContext objektas, kuris tada naudojamas kaip kontekstas šioms katalogo operacijoms. Kuriant naują Kontekstas objektas Konfigūruoju tokias savybes kaip vartotojo vardas, slaptažodis ir autentifikavimo mechanizmas, kuriuos galima naudoti prisijungiant prie LDAP serverio. Man tai pavyko sukūrus „Hashtable“ objektas, nustatydamas visas šias ypatybes kaip raktų / reikšmių poras „Hashtable“ ir praeina „Hashtable“ į InitialDirContext konstruktorius.

Neatidėliotina šio požiūrio problema yra ta, kad visus konfigūracijos parametrus užkodavau .java faile. Tai tinka mano pavyzdžiui, bet ne realaus pasaulio programai. Realiame pasaulyje norėčiau išsaugoti ryšio ypatybes faile jndi.properties ir įdėti tą failą į savo projekto classpath arba jo aplanką / lib. Sukūrus naują InitialDirContext objekto, JNDI API abiejose tose vietose ieško failo jndi.properties, tada naudodamasis juo sukūrė ryšį su LDAP serveriu.

JNDI konfigūracijos parametrai

2 sąraše rodomi JNDI konfigūracijos parametrai prisijungiant prie mano LDAP serverio. Toliau paaiškinu parametrų reikšmę.

Sąrašas 2. LDAP JNDI konfigūracijos parametrai

java.naming.factory.initial = com.sun.jndi.ldap.LdapCtxFactory java.naming.provider.url = ldap: // localhost: 10389 / ou = system java.naming.security.authentication = paprastas java.naming.security .principal = uid = admin, ou = sistema java.naming.security.credentials = secret
  1. Kontekstas.INITIAL_CONTEXT_FACTORY (java.naming.factory.inicial) turėtų būti lygus visiškai kvalifikuotam klasės pavadinimui, kuris bus naudojamas kuriant naują pradinį kontekstą. Jei vertė nenurodyta, tada „NoInitialContextException“ yra išmestas.
  2. Kontekstas.PROVIDER_URL (java.naming.provider.url) turėtų būti lygus LDAP serverio, prie kurio norite prisijungti, URL. Tai turėtų būti tokio formato ldap: //:.
  3. Kontekstas.SECURITY_AUTHENTICATION (java.naming.security.autentifikacija) nurodo norimo naudoti autentifikavimo mechanizmo tipą. Savo pavyzdyje autentifikavimui naudojau vartotojo vardą ir slaptažodį, todėl šios ypatybės vertė yra paprastas.
  4. Kontekstas.SECURITY_PRINCIPAL (java.pavadinimas.augumas.pagrindinis) reiškia išskirtinį vartotojo vardą (DN), kuris turėtų būti naudojamas užmegzti ryšį.
  5. Kontekstas.SECURITY_CREDENTIALS (java.naming.security.credentials) nurodo vartotojo slaptažodį.

JNDI kliento kodas

Gavęs Kontekstas objektas mano kitas žingsnis yra sukurti „SearchControl“ objektas, kuriame pateikiami veiksniai, lemiantys mano paieškos apimtį ir tai, kas bus grąžinta. Noriu ieškoti visame poskyryje, įsišaknijusiame kontekste, todėl nustatiau paieškos sritį SUBTREE_SCOPE paskambinę setSearchScope () metodas „SearchControl“, kaip anksčiau parodyta 1 sąraše.

Toliau skambinu Paieška() metodas „DirContext“, praeina (objektų klasė = asmuo) kaip filtro reikšmė. Paieška() metodas grąžins a PavadinimasSkaitymas objektas, kuriame yra visi įrašai Kontekstas, kur objekto klasė yra lygus asmuo. Gavęs a PavadinimasSkaitymas kaip savo rezultato objektą, aš kartojuosi per jį ir spausdinu a cn atributas kiekvienam Asmuo objektas.

Tai užbaigia mano paaiškinimą apie JNDI kliento kodą. Pažvelgę ​​į „SimpleLDAPClient.java“, rodomą 1 sąraše, galite lengvai pastebėti, kad daugiau nei pusė kodo nukreipiama į išteklių atidarymą ir uždarymą. Kita JNDI API problema yra ta, kad dauguma jo metodų išmeta a „NamingException“ arba vieną iš jo poklasių, jei yra klaida. Nes „NamingException“ yra pažymėta išimtis, turite ją tvarkyti, jei ji išmetama, bet ar tikrai galite atsigauti po išimties, jei jūsų LDAP serveris neveikia? Ne, negalima.

Dauguma kūrėjų apeina JNDI „NamingException“s paprasčiausiai juos gaudydamas ir nieko nedarydamas. Šio sprendimo bėda ta, kad dėl to galite prarasti svarbią informaciją.