Spring Data avec Spring Security

1. Vue d'ensemble

Spring Security fournit un bon support pour l'intégration avec Spring Data. Alors que le premier gère les aspects de sécurité de notre application, le second fournit un accès pratique à la base de données contenant les données de l'application.

Dans cet article, nous verrons comment Spring Security peut être intégré à Spring Data pour permettre des requêtes plus spécifiques à l'utilisateur .

2. Configuration des données Spring Security + Spring

Dans notre introduction à Spring Data JPA, nous avons vu comment configurer Spring Data dans un projet Spring. Pour activer la sécurité Spring et les données Spring, comme d'habitude, nous pouvons adopter la configuration Java ou XML.

2.1. Configuration Java

Rappelez-vous qu'à partir du formulaire de connexion Spring Security (sections 4 et 5), nous pouvons ajouter Spring Security à notre projet en utilisant la configuration basée sur les annotations:

@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { // Bean definitions }

D'autres détails de configuration incluraient la définition des filtres, des beans et d'autres règles de sécurité selon les besoins.

Pour activer Spring Data dans Spring Security, nous ajoutons simplement ce bean à WebSecurityConfig :

@Bean public SecurityEvaluationContextExtension securityEvaluationContextExtension() { return new SecurityEvaluationContextExtension(); }

La définition ci-dessus permet l'activation de la résolution automatique d'expressions spécifiques aux données de ressort annotées sur les classes.

2.2. Configuration XML

La configuration basée sur XML commence par l'inclusion de l'espace de noms Spring Security:

 ... 

Tout comme dans la configuration basée sur Java, pour la configuration basée sur XML ou sur un espace de noms, nous ajouterions le bean SecurityEvaluationContextExtension au fichier de configuration XML:

La définition de SecurityEvaluationContextExtension rend toutes les expressions courantes de Spring Security disponibles à partir des requêtes Spring Data.

Ces expressions courantes incluent principal, authentication, isAnonymous (), hasRole ([role]), isAuthenticated, etc.

3. Exemple d'utilisation

Considérons quelques cas d'utilisation de Spring Data et Spring Security.

3.1. Restreindre la mise à jour du champ AppUser

Dans cet exemple, nous allons voir restreindre App utilisateur de lastlogin champ mise à jour le seul utilisateur authentifié.

Par cela, nous entendons que chaque fois que la méthode updateLastLogin est déclenchée, elle ne met à jour que le champ lastLogin de l'utilisateur actuellement authentifié.

Pour ce faire, nous ajoutons la requête ci-dessous à notre interface UserRepository :

@Query("UPDATE AppUser u SET u.lastLogin=:lastLogin WHERE" +" u.username = ?#{ principal?.username }") public void updateLastLogin (Date lastLogin);

Sans l'intégration de Spring Data et de Spring Security, nous devrions normalement transmettre le nom d'utilisateur comme argument à updateLastLogin .

Dans le cas où les informations d'identification de l'utilisateur incorrectes sont fournies, le processus de connexion échouera et nous n'avons pas à nous soucier d'assurer la validation de l'accès.

3.2. Récupérer le contenu spécifique d'un utilisateur avec une pagination

Un autre scénario dans lequel Spring Data et Spring Security fonctionnent parfaitement main dans la main est un cas où nous devons récupérer du contenu de notre base de données qui appartient à l'utilisateur actuellement authentifié.

Par exemple, si nous avons une application de tweeter, nous pouvons souhaiter afficher les tweets créés ou appréciés par l'utilisateur actuel sur sa page de flux personnalisés.

Bien entendu, cela peut impliquer l'écriture de requêtes pour interagir avec une ou plusieurs tables de notre base de données. Avec Spring Data et Spring Security, c'est aussi simple que d'écrire:

public interface TweetRepository extends PagingAndSortingRepository { @Query("select twt from Tweet twt JOIN twt.likes as lk where lk ?#{ principal?.username } or twt.owner = ?#{ principal?.username }") Page getMyTweetsAndTheOnesILiked(Pageable pageable); }

Parce que nous voulons que nos résultats soient paginés , notre TweetRepository étend PagingAndSortingRepository dans la définition d'interface ci-dessus.

4. Conclusion

L'intégration de Spring Data et de Spring Security apporte une grande flexibilité à la gestion des états authentifiés dans les applications Spring.

Dans cette session, nous avons examiné comment ajouter Spring Security à Spring Data. Pour en savoir plus sur les autres fonctionnalités puissantes de Spring Data ou Spring Security, consultez notre collection d'articles Spring Data et Spring Security.

Comme d'habitude, des extraits de code peuvent être trouvés sur GitHub.