Programmering

Forenkle katalogtilgang med Spring LDAP

Spring LDAP er et vårbasert rammeverk som forenkler LDAP-programmering på Java-plattformen. I denne trinnvise veiledningen for bruk av Spring LDAP vil du lære hvordan rammeverket håndterer koding på lavt nivå som kreves av de fleste LDAP-klienter, slik at du kan fokusere på å utvikle applikasjonens forretningslogikk. Du vil også øve på enkle CRUD-operasjoner ved hjelp av Spring LDAP og lære om mer avanserte operasjoner som å lage dynamiske filtre og konvertere LDAP-oppføringer til Java-bønner.

Lightweight Directory Access Protocol er en viktig komponent i de fleste store applikasjonsdistribusjoner i dag. LDAP brukes primært til å lagre informasjon relatert til brukeridentitet, for eksempel brukerens brukernavn, passord og e-postadresse. Den brukes også i sikkerhetsimplementeringer der det er nødvendig å lagre brukerrettigheter for autentisering og autorisasjonsformål.

Java Naming and Directory Interface (JDNI) er API som brukes for LDAP-programmering på Java-plattformen. Den definerer et standard grensesnitt som kan brukes i applikasjonen din til å samhandle med hvilken som helst LDAP-server. Dessverre innebærer bruk av JNDI vanligvis å skrive mye repeterende kode på lavt nivå. JNDI gjør alt for mye arbeid med enkle prosedyrer, for eksempel å sikre at ressursene er riktig åpnet og lukket. I tillegg kaster de fleste JNDI-metoder kontrollerte unntak, som er tidkrevende å håndtere. Ved nøye inspeksjon ser det ut til at 50 til 60 prosent av tiden brukt på programmering av JNDI er bortkastet på å håndtere repeterende oppgaver.

Spring LDAP er et open source Java-bibliotek designet for å forenkle LDAP-programmering på Java-plattformen. Akkurat som Spring Framework tar mye av programmeringen på lavt nivå ut av Java enterprise applikasjonsutvikling, frigjør Spring LDAP deg fra de infrastrukturelle detaljene ved bruk av LDAP. Snarere enn å bekymre seg for Navngi unntaks og får InitialContexts, du er fri til å konsentrere deg om applikasjonens forretningslogikk. Vår-LDAP definerer også et omfattende ukontrollert unntakshierarki og gir hjelpeklasser for å bygge LDAP-filtre og fremtredende navn.

Vår LDAP og JNDI

Merk at vår LDAP-rammeverk ikke erstatter JNDI. Snarere gir det wrapper- og verktøyklasser over JNDI for å forenkle LDAP-programmering på Java-plattformen.

I denne artikkelen, en nybegynnerveiledning for bruk av Spring LDAP, begynner jeg med å utvikle et enkelt JNDI-program for å utføre et LDAP-søk. Deretter demonstrerer jeg hvor mye lettere det er å gjøre det samme ved hjelp av Spring LDAP-rammeverket. Jeg viser deg hvordan du bruker Spring LDAP AttributeMappers for å kartlegge LDAP-attributter til Java-bønner, og hvordan du bruker de dynamiske filtrene til å lage spørsmål. Til slutt vil jeg gi en trinnvis introduksjon til bruk av Spring LDAP-rammeverket for å legge til, slette og endre data på LDAP-serveren din.

Merk at denne artikkelen forutsetter at du er kjent med konseptene og terminologien i Spring Framework. Se seksjonen Ressurser for å lære mer om Spring Framework, LDAP og JNDI, samt for å laste ned prøveprogrammet.

En enkel JNDI-klient

Oppføring 1 viser et enkelt JNDI-program som vil skrive ut cn attributter til alle Person skriv objekter på konsollen.

Oppføring 1. SimpleLDAPClient.java

offentlig klasse 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, "enkel"); env.put (Context.SECURITY_PRINCIPAL, "uid = admin, ou = system"); env.put (Context.SECURITY_CREDENTIALS, "hemmelig"); DirContext ctx = null; NamingEnumeration results = null; prøv {ctx = new InitialDirContext (env); SearchControls-kontroller = nye SearchControls (); controls.setSearchScope (SearchControls.SUBTREE_SCOPE); resultater = ctx.search ("", "(objectclass = person)", kontroller); mens (results.hasMore ()) {SearchResult searchResult = (SearchResult) results.next (); Attributter attributter = searchResult.getAttributter (); Attributt attr = attributter.get ("cn"); String cn = (String) attr.get (); System.out.println ("Person Common Name =" + cn); }} fange (NamingException e) {throw new RuntimeException (e); } til slutt {if (results! = null) {try {results.close (); } fange (Unntak e) {}} hvis (ctx! = null) {prøv {ctx.close (); } fange (Unntak e) {}}}}}

Det første jeg har gjort i Listing 1 er å lage en InitialDirContext objekt, som deretter brukes som kontekst for følgende katalogoperasjoner. Når du lager en ny Kontekst objekt Jeg konfigurerer egenskaper som brukernavn, passord og autentiseringsmekanisme som kan brukes til å koble til LDAP-serveren. Jeg har klart dette ved å lage en Hashtable objektet, og setter opp alle disse egenskapene som nøkkel / verdipar i Hashtable og passerer Hashtable til InitialDirContext konstruktør.

Det umiddelbare problemet med denne tilnærmingen er at jeg har hardkodet alle konfigurasjonsparametrene i en .java-fil. Dette fungerer bra for mitt eksempel, men ikke for en virkelig applikasjon. I et virkelig program vil jeg lagre tilkoblingsegenskapene i en jndi.properties-fil og plassere den i prosjektets klassesti eller i / lib-mappen. Ved opprettelsen av en ny InitialDirContext objektet, ville JNDI API lete jndi.properties-filen på begge disse stedene, og deretter bruke den til å opprette en forbindelse til LDAP-serveren.

JNDI-konfigurasjonsparametere

Oppføring 2 viser JNDI-konfigurasjonsparametrene for tilkobling til LDAP-serveren min. Jeg forklarer betydningen av parametrene nedenfor.

Oppføring 2. JNDI-konfigurasjonsparametere for LDAP

java.naming.factory.initial = com.sun.jndi.ldap.LdapCtxFactory java.naming.provider.url = ldap: // localhost: 10389 / ou = system java.naming.security.authentication = enkel java.naming.security .principal = uid = admin, ou = system java.naming.security.credentials = hemmelig
  1. Kontekst.INITIAL_CONTEXT_FACTORY (java.naming.factory.initial) skal være lik det fullt kvalifiserte klassenavnet som skal brukes til å lage en ny innledende kontekst. Hvis ingen verdi er spesifisert, vil NoInitialContextException blir kastet.
  2. Kontekst.PROVIDER_URL (java.naming.provider.url) skal være lik URL-adressen til LDAP-serveren du vil koble til. Det skal være i formatet ldap: //:.
  3. Kontekst.SECURITY_AUTHENTICATION (java.naming.security.authentication) representerer typen autentiseringsmekanisme du vil bruke. Jeg har brukt et brukernavn og passord for autentisering i eksemplet mitt, så verdien av denne egenskapen er enkel.
  4. Kontekst.SECURITY_PRINCIPAL (java.naming.security.principal) representerer det fremtredende brukernavnet (DN) som skal brukes til å opprette en forbindelse.
  5. Kontekst.SECURITY_CREDENTIALS (java.naming.security.credentials) representerer brukerens passord.

JNDI-klientkoden

Etter å ha fått Kontekst objektet mitt neste trinn er å lage en Søkekontroll objekt, som innkapsler faktorene som bestemmer omfanget av søket mitt og hva som skal returneres. Jeg vil søke i hele undertreet som er forankret i konteksten, så jeg setter søkeområdet til SUBTREE_SCOPE ved å ringe setSearchScope () Metode av Søkekontroll, som tidligere vist i Oppføring 1.

Deretter kaller jeg Søk() Metode av DirContext, passerer inn (objektklasse = person) som verdien av filteret. De Søk() metoden vil returnere a NamingEnumeration objekt som inneholder alle oppføringene i undertreet av Kontekst, hvor objektklasse er lik person. Etter å ha fått en NamingEnumeration som resultatobjekt, gjentar jeg det og skriver ut a cn attributt for hver Person gjenstand.

Det fullfører forklaringen min på JNDI-klientkoden. Når du ser på SimpleLDAPClient.java, vist i Listing 1, kan du enkelt se at mer enn halvparten av koden går mot å åpne og lukke ressurser. Et annet problem med JNDI API er at de fleste av metodene vil kaste et Navngi unntak eller en av underklassene i tilfelle en feil. Fordi Navngi unntak er et avkrysset unntak, må du håndtere det hvis det blir kastet, men kan du virkelig komme deg fra et unntak hvis LDAP-serveren din er nede? Nei, du kan ikke.

De fleste utviklere kommer rundt JNDI Navngi unntaks ved ganske enkelt å fange dem og ikke gjøre noe. Problemet med denne løsningen er at den kan føre til at du mister viktig informasjon.

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