Spring Data avec Spring Security

Données Spring 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 allons expliquer commentSpring Security can be integrated with Spring Data to enable more user-specific queries.

2. Sécurité Spring + Configuration des données Spring

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

2.1. Configuration Java

Rappelez-vous qu'à partir deSpring Security Login Form (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 d'activer la résolution automatique d'expressions spécifiques à des données de ressort annotées sur des classes.

2.2. Configuration XML

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


...

Tout comme dans la configuration Java, pour la configuration XML ou basée sur l'espace de noms, nous ajouterons le beanSecurityEvaluationContextExtension au fichier de configuration XML:

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

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

3. Exemple d'utilisation

Prenons quelques cas d'utilisation de Spring Data et Spring Security.

3.1. Restreindre la mise à jour du champAppUser

Dans cet exemple, nous allons voir comment restreindre la mise à jour du champAppUserlastLogin au seul utilisateur actuellement authentifié.

Par cela, nous voulons dire qu'à chaque fois que la méthodeupdateLastLogin est déclenchée, elle ne met à jour que le champlastLogin de l'utilisateur actuellement authentifié.

Pour y parvenir, nous ajoutons la requête ci-dessous à notre interfaceUserRepository:

@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 devrons normalement transmettre le nom d'utilisateur en argument àupdateLastLogin.

Si les informations d'identification de l'utilisateur sont incorrectes, le processus de connexion échouera et nous n'aurons pas à nous préoccuper de la validation de l'accès.

3.2. Récupérer du contenuAppUser' spécifique avec pagination

Un autre scénario dans lequel Spring Data et Spring Security fonctionnent parfaitement ensemble est le cas dans lequel nous devons extraire le contenu de notre base de données appartenant à l'utilisateur actuellement authentifié.

Par exemple, si nous avons une application de tweeter, nous voudrons peut-être afficher les tweets créés ou appréciés par les utilisateurs actuels sur leur page de flux personnalisée.

Bien entendu, cela peut impliquer d'écrire des requêtes pour interagir avec une ou plusieurs tables de notre base de données. Avec Spring Data et Spring Security, ceci 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, notreTweetRepository étendPagingAndSortingRepository dans la définition d'interface ci-dessus.

4. Conclusion

L'intégration de Spring Data et de Spring Security offre une grande flexibilité pour 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 surSpring Data etSpring Security.

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