Spring Data mit Spring Security

Federdaten mit Federsicherheit

1. Überblick

Spring Security bietet eine gute Unterstützung für die Integration mit Spring Data. Während Ersteres Sicherheitsaspekte unserer Anwendung behandelt, bietet Letzteres einen bequemen Zugriff auf die Datenbank mit den Daten der Anwendung.

In diesem Artikel werden wir diskutieren, wieSpring Security can be integrated with Spring Data to enable more user-specific queries.

2. Spring Security + Spring Data-Konfiguration

In unserenintroduction to Spring Data JPA haben wir gesehen, wie Spring Data in einem Spring-Projekt eingerichtet wird. Um die Federsicherheit und die Federdaten wie gewohnt zu aktivieren, können wir entweder die Java- oder die XML-basierte Konfiguration verwenden.

2.1. Java-Konfiguration

Denken Sie daran, dass wir abSpring Security Login Form (Abschnitte 4 und 5) Spring Security mithilfe der auf Anmerkungen basierenden Konfiguration zu unserem Projekt hinzufügen können:

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

Weitere Konfigurationsdetails umfassen die Definition von Filtern, Beans und anderen Sicherheitsregeln nach Bedarf.

Um Spring Data in Spring Security zu aktivieren, fügen wir diese Bean einfach zuWebSecurityConfig hinzu:

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

Die obige Definition ermöglicht die Aktivierung der automatischen Auflösung von frühlingsdatenspezifischen Ausdrücken, die mit Anmerkungen zu Klassen versehen sind.

2.2. XML-Konfiguration

Die XML-basierte Konfiguration beginnt mit der Einbeziehung des Spring Security-Namespace:


...

Genau wie in der Java-basierten Konfiguration fügen wir für die XML- oder Namespace-basierte KonfigurationSecurityEvaluationContextExtension Bean zur XML-Konfigurationsdatei hinzu:

Durch das Definieren vonSecurityEvaluationContextExtension werden alle allgemeinen Ausdrücke in Spring Security in Spring Data-Abfragen verfügbar.

Solche gebräuchlichen Ausdrücke umfassenprincipal, authentication, isAnonymous(), hasRole([role]), isAuthenticated, usw.

3. Beispiel Verwendung

Betrachten wir einige Anwendungsfälle von Spring Data und Spring Security.

3.1. Beschränken Sie die Feldaktualisierung vonAppUser

In diesem Beispiel wird versucht, die Feldaktualisierung vonAppUserlastLoginauf den einzigen derzeit authentifizierten Benutzer zu beschränken.

Damit meinen wir, dass jedes Mal, wenn die MethodeupdateLastLoginausgelöst wird, nur das FeldlastLogindes aktuell authentifizierten Benutzers aktualisiert wird.

Um dies zu erreichen, fügen wir die folgende Abfrage zu unsererUserRepository-Schnittstelle hinzu:

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

Ohne die Integration von Spring Data und Spring Security müssten wir normalerweise den Benutzernamen als Argument anupdateLastLogin übergeben.

In einem Fall, in dem die falschen Benutzeranmeldeinformationen angegeben werden, schlägt der Anmeldevorgang fehl und wir müssen uns nicht um die Überprüfung des Zugriffs kümmern.

3.2. Abrufen eines bestimmtenAppUser'-Inhalts mit Paginierung

Ein weiteres Szenario, in dem Spring Data und Spring Security perfekt zusammenarbeiten, ist das Abrufen von Inhalten aus unserer Datenbank, deren Eigentümer der derzeit authentifizierte Benutzer ist.

Wenn wir beispielsweise eine Hochtöneranwendung haben, möchten wir möglicherweise Tweets, die vom aktuellen Benutzer erstellt wurden oder ihm gefallen, auf seiner personalisierten Feed-Seite anzeigen.

Dies kann natürlich das Schreiben von Abfragen zur Interaktion mit einer oder mehreren Tabellen in unserer Datenbank beinhalten. Mit Spring Data und Spring Security ist dies so einfach wie das Schreiben:

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

Da wir möchten, dass unsere Ergebnisse paginiert werden, erweitert unserTweetRepositoryPagingAndSortingRepository in der obigen Schnittstellendefinition.

4. Fazit

Die Integration von Spring Data und Spring Security bietet viel Flexibilität bei der Verwaltung authentifizierter Status in Spring-Anwendungen.

In dieser Sitzung haben wir uns angesehen, wie Sie Spring Data Spring Security hinzufügen. Weitere Informationen zu anderen leistungsstarken Funktionen von Spring Data oder Spring Security finden Sie in unserer Sammlung von Artikeln zuSpring Data undSpring Security.

Wie üblich können Codefragmenteover on GitHub gefunden werden.