Federdaten mit Federsicherheit

1. Übersicht

Spring Security bietet eine gute Unterstützung für die Integration in 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 wird erläutert, wie Spring Security in Spring Data integriert werden kann, um benutzerspezifischere Abfragen zu ermöglichen .

2. Spring Security + Spring Data-Konfiguration

In unserer Einführung zu 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 übernehmen.

2.1. Java-Konfiguration

Denken Sie daran, dass wir aus dem Spring Security-Anmeldeformular (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 zu WebSecurityConfig hinzu :

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

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

2.2. XML-Konfiguration

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

 ... 

Genau wie in der Java-basierten Konfiguration würden wir für die XML- oder Namespace-basierte Konfiguration die SecurityEvaluationContextExtension- Bean zur XML-Konfigurationsdatei hinzufügen :

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

Solche allgemeinen Ausdrücke umfassen Prinzipal, Authentifizierung, isAnonymous (), hasRole ([Rolle]), isAuthenticated usw.

3. Beispiel für die Verwendung

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

3.1. Beschränken AppUser Feldaktualisierung

In diesem Beispiel werden wir uns beschränken suchen App Benutzer ‚s Lastlogin Update Feld an die einzige derzeit authentifizierten Benutzer.

Damit meinen wir, dass jedes Mal , wenn die updateLastLogin- Methode ausgelöst wird, nur das lastLogin- Feld des aktuell authentifizierten Benutzers aktualisiert wird .

Um dies zu erreichen, fügen wir die folgende Abfrage zu unserer UserRepository- Oberfläche 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 an updateLastLogin ü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 bestimmten AppUser- Inhalts mit Paginierung

Ein weiteres Szenario, in dem Spring Data und Spring Security perfekt Hand in Hand arbeiten, ist ein Fall, in dem wir Inhalte aus unserer Datenbank abrufen müssen, die dem aktuell authentifizierten Benutzer gehören.

Wenn wir beispielsweise eine Hochtöneranwendung haben, möchten wir möglicherweise Tweets, die vom aktuellen Benutzer erstellt oder gemocht wurden, 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 unsere Ergebnisse paginierte wollen, unsere TweetRepository erstreckt PagingAndSortingRepository in der obigen Schnittstellendefinition.

4. Fazit

Die Integration von Spring Data und Spring Security bietet viel Flexibilität bei der Verwaltung authentifizierter Zustände 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 zu Spring Data und Spring Security.

Wie üblich finden Sie Code-Schnipsel auf GitHub.