Stellen Sie die Sicherheit Ihrer Spring-Anwendung sicher, indem Sie die robusten Funktionen des Spring Security-Frameworks nutzen.

Das Spring Security-Framework sichert Ihre Anwendung durch Authentifizierung und Autorisierung. Im Standardzustand stellt Spring Security sicher, dass jeder HTTP-Anforderungspfad (oder jede HTTP-Anforderungsseite) in Ihrer Anwendung die Authentifizierung eines einzelnen globalen Benutzers erfordert.

Dieses Framework ist zudem äußerst flexibel. Sie können damit benutzerdefinierte Sicherheitsregeln für jeden HTTP-Anforderungspfad in Ihrer Anwendung sowie für die verschiedenen Benutzer erstellen. So können Sie die Sicherheitsbeschränkung auf Seiten aufheben, die keine Benutzerautorisierung erfordern (z. B. eine Homepage). Und legen Sie die Rollen und Berechtigungen bestimmter Benutzertypen fest.

Hinzufügen von Spring-Sicherheit zu Ihrer Anwendung

Es gibt zwei Möglichkeiten, Spring Security zu Ihrer Anwendung hinzuzufügen. Sie können es entweder beim Generieren einer neuen Spring Boot-Anwendung als Abhängigkeit auswählen

instagram viewer
mit Spring initializr, oder fügen Sie es Ihrer Build-Spezifikationsdatei im Abschnitt „Abhängigkeiten“ hinzu, nachdem Sie Ihr Projekt generiert haben.

Wenn Sie eine der Gradle-Projektoptionen ausgewählt haben, ist die Abhängigkeitsdatei vorhanden build.gradle. Wenn Sie sich jedoch für Maven entschieden haben, ist diese Datei vorhanden pom.xml.

Dein build.gradle Die Datei sollte die folgende Abhängigkeit enthalten:

dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}

Während Ihr pom.xml Die Datei sollte die folgende Abhängigkeit enthalten:


org.springframework.boot
spring-boot-starter-security

Die im Artikel verwendete Beispielanwendung finden Sie hier GitHub-Repository Die Nutzung steht Ihnen unter der MIT-Lizenz kostenlos zur Verfügung.

Verwendung von Spring Security

Sobald Sie die Spring Security-Abhängigkeit zu Ihrer Anwendung hinzugefügt haben, können Sie das Framework sofort verwenden. Führen Sie einfach Ihre Anwendung aus und navigieren Sie dann zur Spring Boot-Homepage (oder einer beliebigen Seite in Ihrer Anwendung). Die Beispielanwendung verwendet den folgenden anfänglichen Controller, um die Standardeinstellungen von Spring Boot zu steuern localhost: 8080 Anfrage:

package com.springSecurityDemo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
publicclassWebController{

@GetMapping("/")
public String home(){
return"Welcome!";
}
}

Wenn Sie Ihre Anwendung nach dem Hinzufügen der einzelnen Controller-Klasse oben ausführen, wird die folgende anfängliche Ansicht generiert:

Sie werden feststellen, dass Sie automatisch dorthin weitergeleitet werden localhost: 8080/login Dies geschieht, bevor Sie auf eine andere Seite der Anwendung zugreifen können. In dieser Phase müssen Sie den Standardbenutzernamen (den Benutzer) und das automatisch generierte Passwort (das Sie in der Konsole finden) angeben. Die Konsole generiert eine Zeile wie die folgende:

Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81

Bei jedem Neustart Ihrer Anwendung ändert sich das automatisch generierte Passwort, der Benutzername bleibt jedoch derselbe. Durch Eingabe des Standardbenutzernamens und -kennworts gelangen Sie zur entsprechenden Ansicht in Ihrer Anwendung.

Anpassen der Spring-Sicherheit

Um Ihre Anwendungssicherheit anzupassen, müssen Sie die Standardkonfiguration von Spring Security überschreiben. Zuvor (vorausgesetzt, Sie verfügen bereits über Spring Web) benötigen Sie jedoch mehrere andere Abhängigkeiten für diese Beispielanwendung:

  • Spring Data JPA
  • MySQL JDBC-Treiber
  • Thymianblatt
  • Lombok

Das Thymeleaf-Framework generiert verschiedene Ansichten. Lombok hilft dabei, den Code in Ihren Objektklassen zu reduzieren. Die JPA-Bibliothek und der MySQL-Treiber ermöglichen Ihnen die Verwendung einer MySQL-Datenbank mit der Anwendung, Sie haben jedoch die Möglichkeit, jede beliebige Datenbank zu verwenden, mit der Sie vertraut sind. Die Verwendung einer Datenbank bedeutet die Konfiguration der application.properties Datei unter der Ressourcendatei.

spring.datasource.url=jdbc: mysql://${MYSQL_HOST: localhost}:3306/spring_security
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update

Mit dem obigen Konfigurationscode können Sie eine Verbindung zu einer lokalen MySQL-Datenbank namens herstellen spring_security, mit einem Benutzernamen von Wurzel, und Passwort (1234). Sie müssen diese Daten aktualisieren, damit sie mit Ihrem Datenbanknamen und Ihren Anmeldeinformationen übereinstimmen.

Nachdem Sie Ihre zusätzlichen Abhängigkeiten hinzugefügt und Ihre Datenbank erstellt haben, können Sie mit der Entscheidung beginnen, wie viele Ansichten Ihre Anwendung haben soll. Sie müssen auch wissen, wie die Sicherheit für jede Seite aussieht. Unsere Beispielanwendung verfügt über 6 Ansichten:

  • Startseite
  • Registrierungsseite
  • Loginseite
  • Abmeldeseite
  • Benutzerseite
  • Fehlerseite

Die einzige Ansicht, für die eine Benutzerautorisierung erforderlich ist, ist die Benutzerseite. Auf diese Seite können nur Benutzer zugreifen, die sich zunächst registrieren und sich dann bei der Anwendung anmelden. Zusätzlich zum Standardpaket von Spring Boot müssen Sie vier weitere Pakete in Ihrer Anwendung erstellen.

Die Registrierungscontrollerklasse

Das Controller-Paket enthält die Klassen, die HTTP-Anfragen verarbeiten. Abhängig von der Funktion einer Seite können Sie normalerweise jede HTTP-Anfrage in einer Controller-Klasse zusammenfassen, wie dies bei der der Fall ist WebController Klasse. Die Registrierungsansicht verfügt jedoch über einzigartigere Funktionen und kann daher eine private Controller-Klasse haben:

@Controller
@RequestMapping("/register")
publicclassRegistrationController{
private UserRepository userRepo;
private PasswordEncoder passwordEncoder;

publicRegistrationController( UserRepository userRepo, PasswordEncoder passwordEncoder){
this.userRepo = userRepo;
this.passwordEncoder = passwordEncoder;
}
@GetMapping
public String registerForm(){
return"registration";
}
@PostMapping
public String processRegistration(RegistrationForm form){
userRepo.save(form.toUser(passwordEncoder));
return"redirect:/login";
}
}

Der RegistrationController Die Klasse ist ein Tor zum Sicherheitsaspekt Ihrer Anwendung. Der @RequestMapping Die Annotation gibt die Art der Anfrage an, die dieser Controller verarbeiten wird (Anfragen an). localhost: 8080/register).

Der @GetMapping Die Anmerkung gibt lediglich an, dass die Anwendung eine Anfrage erhält /register, Die Anmeldeformular() Die Methode sollte diese Anfrage verarbeiten, indem sie die Registrierungsansicht zurückgibt.

Nachdem ein Besucher auf die Schaltfläche „Registrieren“ geklickt hat, wird die @PostMapping Anmerkung kommt ins Spiel. Der ProzessRegistration() Mit der Methode können Sie die Benutzerdaten veröffentlichen, die sie von erhält Anmeldeformular Klasse in die Datenbank, mit der UserRepository Klasse. Aber bevor es diese Daten speichert, muss das ProzessRegistration() Methode verschlüsselt das Passwort des Benutzers mit Der FrühlingPasswortEncoder Schnittstelle.

Erstellen neuer Sicherheitskonfigurationen

Seit Spring 3.1 können Entwickler nun Konfigurationen für Spring Security mit Java erstellen, also Klassen statt XML. Das Wichtigste, was diese Konfigurationsklassen erfordern, ist die @Aufbau Anmerkung.

@Configuration
publicclassSecurityConfiguration{
}

Der @Aufbau Die Annotation zeigt an, dass es sich bei der oben genannten Klasse um eine Konfigurationsklasse handelt. Diese Klassen stellen Bohnen für die bereit Kontext der Spring-AnwendungDabei handelt es sich um einen Container, den Spring zum Erstellen und Verwalten der verschiedenen Komponenten (oder Beans) einer Anwendung verwendet. Die erste Bohne im Sicherheitskonfiguration Klasse ist die PasswortEncoder Bohne.

@Bean
public PasswordEncoder passwordEncoder(){
 returnnew BCryptPasswordEncoder();
}

Der RegistrationController Klasse verwendet die PasswortEncoder Bean, um neue Passwörter zu verschlüsseln, bevor sie in der Datenbank gespeichert werden. Eine weitere wichtige Bohne, die Sie hinzufügen müssen Sicherheitskonfiguration Klasse ist die userDetailsService Bohne.

@Bean
public UserDetailsService userDetailsService(UserRepository userRepo){
 return username -> {
Customer customer = userRepo.findByUsername(username);
if (customer != null)
return customer;
thrownew UsernameNotFoundException("Customer '" + username + "' not found");
 };
}

Der userDetailsService Bean beschäftigt Spring SecurityUserDetailsService Schnittstelle zum Abrufen des Benutzernamens und Passworts eines Benutzers zur Authentifizierung während der Anmeldesitzung eines Kunden. Sobald ein Kunde also in der Login-Ansicht auf den Login-Button klickt, wird der userDetailsService Die Bohne setzt sich in Bewegung.

Durch das UserRepository, Die userDetailsService Bean erhält Zugriff auf alle vorhandenen Kunden in der Datenbank. Diese Schnittstelle verwendet dann die UserRepository um einen Benutzer mit einem passenden Benutzernamen und Passwort zu finden, und gibt dann alle Attribute dieses Kunden als Objekt zurück.

Wenn es sich bei dem zurückgegebenen Objekt um einen Kunden handelt, erhält dieser Kunde Zugriff auf die Anwendung. Andernfalls wird die Seite automatisch aktualisiert, sodass der Benutzer gültige Anmeldeinformationen eingeben kann.

Die Filterkette

Spring SecuritySecurityFilterChain Schnittstelle ist nützlich Anwendungsprogrammierschnittstelle (API) Das spielt eine wesentliche Rolle in der Spring Security-Konfiguration. Diese Schnittstelle funktioniert mit Spring SecurityHTTP-Sicherheit Klasse, um eine Filterkette für bestimmte HTTP-Anfragen zu erstellen.

@Bean
public SecurityFilterChain filterChain(HttpSecurity http)throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/user").hasAuthority("USER").anyRequest().permitAll())
.formLogin(formLogin -> formLogin
.loginPage("/login").defaultSuccessUrl("/user", true))
.logout(logout -> logout.logoutSuccessUrl("/logout"));
 return http.build();
}

Der filterChain Bean oben verwendet die SecurityFilterChain API zur Ausführung mehrerer Aufgaben. Erstens verwendet es die HTTP-Sicherheit Klasse, um vorzuschreiben, dass nur Benutzer mit der Rolle eines BENUTZERs darauf zugreifen können localhost: 8080/Benutzer. Und ein Benutzer erhält diese Rolle nach der Registrierung, dank der getAuthorities() Methode, die jedes neue Kundenobjekt implementiert.

@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
 return Arrays.asList(new SimpleGrantedAuthority("USER"));
}

Die Filterkette ermöglicht den unauthentifizierten Zugriff auf alle anderen URLs in der Anwendung. Der filterChain Bean nutzt auch die formLogin() Und Ausloggen() Methoden der HTTP-Sicherheit Klassenobjekt.

Mit diesen Methoden können Sie einen Benutzer automatisch zu bestimmten Seiten weiterleiten, nachdem er eine Aufgabe ausgeführt hat. Also ein Benutzer, der die richtigen Anmeldeinformationen eingibt und auf die Anmeldeschaltfläche klickt /login Die Seite wird automatisch weitergeleitet /user Seite.

Endlich, das filterChain Bean erstellt die Filterkette und gibt sie zurück, die autorisierten Benutzern den Zugriff auf die Anwendung ermöglicht. Alle drei Bohnen im Sicherheitskonfiguration Die Klasse arbeitet zusammen, um Ihre Bewerbung zu sichern.

Allerdings ist die filterChain Bean spielt die wichtigere Rolle, die Autorisierungsebene für zu diktieren jede HTTP-Anfrage. Wenn Sie Ihrer Anwendung weitere Seiten hinzufügen, können Sie die verwenden filterChain Bean, um ihre Sicherheitsstufe festzulegen.

Der Hauptvorteil von Spring Security

Mit Spring Security haben Sie nicht nur die vollständige Kontrolle darüber, wer Zugriff auf Ihre Anwendung hat, sondern auch über die Art des Zugriffs, den ein Benutzer haben kann (über die Benutzerrollenfunktion). Die Zugriffskontrolle ist einer der wichtigsten Aspekte jeder Anwendung. Es könnte sich als kostspieliger Fehler erweisen, allgemeinen Benutzern aufgrund begrenzter Zugriffskontrollbarrieren ungefilterten Zugriff auf Ihre Anwendung zu gewähren.