Spring Security: Authenticatie met een door een database ondersteunde UserDetailsService

1. Overzicht

In dit artikel laten we zien hoe u een op maat gemaakte database kunt maken UserDetailsService voor authenticatie met Spring Security.

2. UserDetailsService

De UserDetailsService interface wordt gebruikt om gebruikersgerelateerde gegevens op te halen. Het heeft één methode met de naam loadUserByUsername () die kan worden overschreven om het proces van het vinden van de gebruiker aan te passen.

Het wordt gebruikt door de DaoAuthenticationProvider om details over de gebruiker te laden tijdens authenticatie.

3. Het Gebruiker Model

Voor het opslaan van gebruikers zullen we een Gebruiker entiteit die is toegewezen aan een databasetabel, met de volgende attributen:

@Entity openbare klasse Gebruiker {@Id @GeneratedValue (strategie = GenerationType.AUTO) privé Lange id; @Column (nullable = false, unique = true) private String gebruikersnaam; privé String-wachtwoord; // standaard getters en setters}

4. Een gebruiker ophalen

Om een ​​gebruiker op te halen die aan een gebruikersnaam is gekoppeld, maken we een DAO klasse gebruiken Lente gegevens door het JpaRepository koppel:

openbare interface UserRepository breidt JpaRepository {User findByUsername (String gebruikersnaam) uit; }

5. Het UserDetailsService

Om onze eigen gebruikersservice te kunnen bieden, moeten we het UserDetailsService koppel.

We maken een klas met de naam MyUserDetailsService dat heft de methode op loadUserByUsername () van de interface.

Bij deze methode halen we de Gebruiker object met behulp van de DAO, en als het bestaat, wikkel het dan in een MyUserPrincipal object, dat implementeert Gebruikersdetails, en geeft het terug:

@Service openbare klasse MyUserDetailsService implementeert UserDetailsService {@Autowired privé UserRepository userRepository; @Override openbare UserDetails loadUserByUsername (String gebruikersnaam) {User user = userRepository.findByUsername (gebruikersnaam); if (user == null) {throw nieuwe UsernameNotFoundException (gebruikersnaam); } retourneer nieuwe MyUserPrincipal (gebruiker); }}

Laten we de MyUserPrincipal klasse als volgt:

openbare klasse MyUserPrincipal implementeert UserDetails {private User user; openbare MyUserPrincipal (gebruiker gebruiker) {this.user = gebruiker; } // ...}

6. Lente configuratie

We zullen beide soorten Spring-configuraties demonstreren: XML en annotatie-gebaseerd, die nodig zijn om onze custom UserDetailsService implementatie.

6.1. Annotatieconfiguratie

Alles wat we moeten doen om onze gewoonte mogelijk te maken UserDetailsService is het toevoegen aan onze toepassingscontext als een boon.

Omdat we onze klas hebben geconfigureerd met de @Onderhoud annotatie, zal de toepassing het automatisch detecteren tijdens het scannen van componenten, en het zal een bean uit deze klasse creëren. Daarom hoeven we hier verder niets te doen.

Als alternatief kunnen we:

  • configureer het in het authenticationManager de ... gebruiken AuthenticationManagerBuilder # userDetailsService methode
  • stel het in als een eigenschap in een gewoonte authenticationProvider bean, en injecteer dat vervolgens met de AuthenticationManagerBuilder # authenticationProvider functie

6.2. XML-configuratie

Aan de andere kant moeten we voor de XML-configuratie een bean met type definiëren MyUserDetailsService, en injecteer het in Spring authenticatie-provider Boon:

7. Andere door een database ondersteunde verificatie-opties

De AuthenticationManagerBuilder biedt een andere methode om op JDBC gebaseerde authenticatie in onze applicatie te configureren.

We zullen het AuthenticationManagerBuilder.jdbcAuthentication met een Databron voorbeeld. Als onze database het Spring User Schema volgt, zullen de standaardconfiguraties goed bij ons passen.

We hebben in een vorig bericht een basisconfiguratie gezien die deze benadering gebruikt.

De JdbcUserDetailsManager entiteit die het resultaat is van deze configuratie implementeert het UserDetailsService te.

Als gevolg hiervan kunnen we concluderen dat deze configuratie eenvoudiger te implementeren is, vooral als we Spring Boot gebruiken dat automatisch het Databron voor ons.

Als we hoe dan ook een hoger niveau van flexibiliteit nodig hebben, precies aanpassen hoe de applicatie de gebruikersgegevens ophaalt, dan kiezen we voor de aanpak die we in deze tutorial hebben gevolgd.

8. Conclusie

Samenvattend: in dit artikel hebben we laten zien hoe u een op maat gemaakt Spring-based UserDetailsService ondersteund door persistente gegevens.

De implementatie is te vinden in het GitHub-project - dit is een op Maven gebaseerd project, dus het zou gemakkelijk te importeren en uit te voeren moeten zijn zoals het is.