Spring LDAP-overzicht

1. Overzicht

LDAP-directoryservers zijn voor lezen geoptimaliseerde hiërarchische gegevensarchieven. Meestal worden ze gebruikt voor het opslaan van gebruikersgerelateerde informatie die nodig is voor gebruikersauthenticatie en autorisatie.

In dit artikel zullen we de Spring LDAP API's verkennen om gebruikers te verifiëren en te zoeken, en om gebruikers op de directoryserver te maken en aan te passen. Dezelfde set API's kan worden gebruikt voor het beheren van elk ander type invoer in LDAP.

2. Maven afhankelijkheden

Laten we beginnen met het toevoegen van de vereiste Maven-afhankelijkheid:

 org.springframework.ldap spring-ldap-core 2.3.1.RELEASE 

De laatste versie van deze afhankelijkheid is te vinden op spring-ldap-core.

3. Voorbereiding van gegevens

Laten we voor de toepassing van dit artikel eerst het volgende LDAP-item maken:

ou = gebruikers, dc = voorbeeld, dc = com (objectClass = organisationUnit)

Onder dit knooppunt zullen we nieuwe gebruikers aanmaken, bestaande gebruikers aanpassen, bestaande gebruikers verifiëren en informatie zoeken.

4. Spring LDAP-API's in

4.1. ContextSource & LdapTemplate Bean-definitie

ContextSource wordt gebruikt voor het maken van de LdapTemplate. We zullen het gebruik van zien ContextSource tijdens gebruikersauthenticatie in de volgende sectie:

@Bean openbare LdapContextSource contextSource () {LdapContextSource contextSource = nieuwe LdapContextSource (); contextSource.setUrl (env.getRequiredProperty ("ldap.url")); contextSource.setBase (env.getRequiredProperty ("ldap.partitionSuffix")); contextSource.setUserDn (env.getRequiredProperty ("ldap.principal")); contextSource.setPassword (env.getRequiredProperty ("ldap.password")); retourneer contextSource; }

LdapTemplate wordt gebruikt voor het maken en wijzigen van LDAP-vermeldingen:

@Bean openbare LdapTemplate ldapTemplate () {retourneer nieuwe LdapTemplate (contextSource ()); }

4.2. Gebruikersverificatie

Laten we nu een eenvoudig stukje logica implementeren om een ​​bestaande gebruiker te authenticeren:

openbare ongeldige authenticatie (String gebruikersnaam, String wachtwoord) {contextSource .getContext ("cn =" + gebruikersnaam + ", ou = gebruikers," + env.getRequiredProperty ("ldap.partitionSuffix"), wachtwoord); }

4.3. Gebruiker aanmaken

Laten we vervolgens een nieuwe gebruiker aanmaken en een SHA-hash van het wachtwoord opslaan in LDAP.

Op het moment van authenticatie genereert de LDAP-server de SHA-hash van het geleverde wachtwoord en vergelijkt deze met het opgeslagen wachtwoord:

public void create (String gebruikersnaam, String wachtwoord) {Naam dn = LdapNameBuilder .newInstance () .add ("ou", "gebruikers") .add ("cn", gebruikersnaam) .build (); DirContextAdapter context = nieuwe DirContextAdapter (dn); context.setAttributeValues ​​("objectclass", nieuwe String [] {"top", "person", "organisationPerson", "inetOrgPerson"}); context.setAttributeValue ("cn", gebruikersnaam); context.setAttributeValue ("sn", gebruikersnaam); context.setAttributeValue ("userPassword", digestSHA (wachtwoord)); ldapTemplate.bind (context); }

digestSHA () is een aangepaste methode die de met Base64 gecodeerde reeks van de SHA-hash van het opgegeven wachtwoord retourneert.

eindelijk, de binden() methode van LdapTemplate wordt gebruikt om een ​​vermelding op de LDAP-server te maken.

4.4. Gebruikerswijziging

We kunnen een bestaande gebruiker of invoer wijzigen met de volgende methode:

openbare ongeldige wijziging (String-gebruikersnaam, String-wachtwoord) {Naam dn = LdapNameBuilder.newInstance () .add ("ou", "gebruikers") .add ("cn", gebruikersnaam) .build (); DirContextOperations context = ldapTemplate.lookupContext (dn); context.setAttributeValues ​​("objectclass", nieuwe String [] {"top", "person", "organisationPerson", "inetOrgPerson"}); context.setAttributeValue ("cn", gebruikersnaam); context.setAttributeValue ("sn", gebruikersnaam); context.setAttributeValue ("userPassword", digestSHA (wachtwoord)); ldapTemplate.modifyAttributes (context); }

De lookupContext () methode wordt gebruikt om de opgegeven gebruiker te vinden.

4.5. Gebruiker zoeken

We kunnen met zoekfilters naar bestaande gebruikers zoeken:

openbare lijst zoeken (String gebruikersnaam) {return ldapTemplate .search ("ou = gebruikers", "cn =" + gebruikersnaam, (AttributesMapper) attrs -> (String) attrs.get ("cn"). get ()); }

De KenmerkenMapper wordt gebruikt om de gewenste attribuutwaarde uit de gevonden items te halen. Intern, Spring LdapTemplate roept de KenmerkenMapper voor alle gevonden items en maakt een lijst met de attribuutwaarden.

5. Testen

lente-ldap-test biedt een embedded LDAP-server op basis van ApacheDS 1.5.5. Om de embedded LDAP-server in te stellen voor testen, moeten we de volgende Spring Bean configureren:

@Bean openbare TestContextSourceFactoryBean testContextSource () {TestContextSourceFactoryBean contextSource = nieuwe TestContextSourceFactoryBean (); contextSource.setDefaultPartitionName (env.getRequiredProperty ("ldap.partition")); contextSource.setDefaultPartitionSuffix (env.getRequiredProperty ("ldap.partitionSuffix")); contextSource.setPrincipal (env.getRequiredProperty ("ldap.principal")); contextSource.setPassword (env.getRequiredProperty ("ldap.password")); contextSource.setLdifFile (resourceLoader.getResource (env.getRequiredProperty ("ldap.ldiffile"))); contextSource.setPort (Integer.valueOf (env.getRequiredProperty ("ldap.port"))); retourneer contextSource; }

Laten we onze gebruikerszoekmethode testen met JUnit:

@Test openbare ongeldig gegevenLdapClient_whenCorrectSearchFilter_thenEntriesReturned () {Lijst gebruikers = ldapClient .search (SEARCH_STRING); assertThat (gebruikers, Matchers.containsInAnyOrder (USER2, USER3)); }

6. Conclusie

In dit artikel hebben we Spring LDAP API's geïntroduceerd en eenvoudige methoden ontwikkeld voor gebruikersauthenticatie, gebruikers zoeken, gebruikers aanmaken en wijzigen in een LDAP-server.

Zoals altijd is de volledige broncode beschikbaar in dit Github-project. De tests worden aangemaakt onder het Maven-profiel "live" en kunnen daarom worden uitgevoerd met de optie "-P live".


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