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".