Spring Data con Spring Security

1. Panoramica

Spring Security fornisce un buon supporto per l'integrazione con Spring Data. Mentre il primo gestisce gli aspetti di sicurezza della nostra applicazione, il secondo fornisce un comodo accesso al database contenente i dati dell'applicazione.

In questo articolo, discuteremo di come è possibile integrare Spring Security con Spring Data per abilitare query più specifiche dell'utente .

2. Spring Security + Spring Data Configuration

Nella nostra introduzione a Spring Data JPA, abbiamo visto come configurare Spring Data in un progetto Spring. Per abilitare Spring Security e Spring Data, come al solito, possiamo adottare la configurazione basata su Java o XML.

2.1. Configurazione Java

Ricorda che dal modulo di accesso di Spring Security (sezioni 4 e 5), possiamo aggiungere Spring Security al nostro progetto utilizzando la configurazione basata sull'annotazione:

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

Altri dettagli di configurazione includerebbero la definizione di filtri, bean e altre regole di sicurezza come richiesto.

Per abilitare Spring Data in Spring Security, aggiungiamo semplicemente questo bean a WebSecurityConfig :

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

La definizione di cui sopra consente l'attivazione della risoluzione automatica delle espressioni specifiche dei dati della molla annotate sulle classi.

2.2. Configurazione XML

La configurazione basata su XML inizia con l'inclusione dello spazio dei nomi Spring Security:

 ... 

Proprio come nella configurazione basata su Java, per la configurazione basata su XML o spazio dei nomi, aggiungeremo il bean SecurityEvaluationContextExtension al file di configurazione XML:

La definizione di SecurityEvaluationContextExtension rende disponibili tutte le espressioni comuni in Spring Security dalle query di Spring Data.

Tali espressioni comuni includono principal, authentication, isAnonymous (), hasRole ([role]), isAuthenticated, ecc.

3. Utilizzo di esempio

Consideriamo alcuni casi d'uso di Spring Data e Spring Security.

3.1. Limita aggiornamento campo utente applicazione

In questo esempio, vedremo limitare App l'utente 's lastLogin aggiornamento campo per l'utente solo attualmente autenticato.

Con questo intendiamo che ogni volta che il metodo updateLastLogin viene attivato, aggiorna solo il campo lastLogin dell'utente attualmente autenticato.

Per ottenere ciò, aggiungiamo la query seguente alla nostra interfaccia UserRepository :

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

Senza l'integrazione di Spring Data e Spring Security, normalmente dovremmo passare il nome utente come argomento per updateLastLogin .

Nel caso in cui vengano fornite le credenziali utente errate, il processo di accesso non andrà a buon fine e non dobbiamo preoccuparci di garantire la convalida dell'accesso.

3.2. Recupera contenuto specifico utente dell'applicazione con impaginazione

Un altro scenario in cui Spring Data e Spring Security funzionano perfettamente mano nella mano è un caso in cui dobbiamo recuperare il contenuto dal nostro database che è di proprietà dell'utente attualmente autenticato.

Ad esempio, se abbiamo un'applicazione tweeter, potremmo voler visualizzare i tweet creati o apprezzati dall'utente corrente nella loro pagina dei feed personalizzati.

Naturalmente, ciò potrebbe comportare la scrittura di query per interagire con una o più tabelle nel nostro database. Con Spring Data e Spring Security, è semplice come scrivere:

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); }

Poiché vogliamo che i nostri risultati siano impaginati, il nostro TweetRepository estende PagingAndSortingRepository nella definizione dell'interfaccia precedente.

4. Conclusione

L'integrazione di Spring Data e Spring Security offre molta flessibilità nella gestione degli stati autenticati nelle applicazioni Spring.

In questa sessione, abbiamo esaminato come aggiungere Spring Security a Spring Data. Ulteriori informazioni su altre potenti funzionalità di Spring Data o Spring Security sono disponibili nella nostra raccolta di articoli Spring Data e Spring Security.

Come al solito, gli snippet di codice possono essere trovati su GitHub.