[JAVA] Spring Boot Tutorial Verwenden der Spring Security-Authentifizierung

Ich habe eine Webseite mit einem sicheren Formular erstellt, indem ich auf das offizielle Spring Boot-Tutorial (Schutz von Webanwendungen (https://spring.io/guides/gs/securing-web/)) verwiesen habe.

Umgebung

Maven 3.6.3 (OK für Maven 3.2 oder höher) Betriebssystem: macOS Mojave Version 10.14.6 Texteditor: VSCode Java: 11.0.2

Erstellen

Öffnen Sie Spring Initializr und erstellen Sie eine Grundlage mit den folgenden Inhalten. Dieses Mal werden wir "Spring Web" und "Thymeleaf" als Abhängigkeiten hinzufügen. スクリーンショット 2020-07-15 11.17.56.png

Entpacken Sie die resultierende Zip-Datei und öffnen Sie sie in einem Editor.

Lassen Sie uns pom.xml überprüfen. Der Inhalt der automatisch erstellten POM-Datei lautet wie folgt.

pom.xml


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.2.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>securing-web</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>securing-web</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

Lassen Sie uns zunächst eine Web-App erstellen, die durch nichts geschützt ist. Die Struktur ist so einfach wie die Anzeige des Startbildschirms und "Hallo Welt".

Erstellen Sie auf dem Startbildschirm. Erstellen Sie eine home.html-Datei unter src / main / resources / templates. Der Inhalt ist wie folgt.

home.html


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org" xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Spring Security Example</title>
    </head>
    <body>
        <h1>Welcome!</h1>

        <p>Click <a th:href="@{/hello}">here</a> to see a greeting.</p>
    </body>
</html>

Erstellen Sie als Nächstes einen Hallo-Bildschirm. Erstellen Sie eine hello.html-Datei unter src / main / resources / templates. Der Inhalt ist wie folgt.

hello.html


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
      xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Hello World!</title>
    </head>
    <body>
        <h1>Hello world!</h1>
    </body>
</html>

Mit Ausnahme des HTML-Tags handelt es sich um eine normale HTML-Datei. Dies wird bei der Implementierung der Sicherheit erneut bearbeitet.

Erstellen Sie als Nächstes eine MvcConfig.java-Datei unter src / main / java / com / example / securingweb. Der Inhalt ist wie folgt.

MvcConfig.java


package com.example.securingweb;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MvcConfig implements WebMvcConfigurer {

	public void addViewControllers(ViewControllerRegistry registry) {
		registry.addViewController("/home").setViewName("home");
		registry.addViewController("/").setViewName("home");
		registry.addViewController("/hello").setViewName("hello");
		registry.addViewController("/login").setViewName("login");
	}

}

Die von der MvcConfig-Klasse geerbte WebMvcConfigurer-Klasse überschreibt die addViewControllers-Methode. Wenn Sie also eine solche Config-Klasse erstellen, können Sie die MVC-Konfiguration realisieren, ohne einen Controller zu erstellen.

Mit @Configuration können Sie verschiedene Einstellungen für Spring konfigurieren. Fügen Sie in der Konfigurationsklasse der Klasse @Configuration hinzu.

Lassen Sie uns nun die App ausführen. Derzeit ist nichts sicher.

Lauf

Führen Sie den folgenden Befehl aus.

./mvnw spring-boot:run

Versuchen Sie nach dem Start, http: // localhost: 8080 / hello in Ihrem Browser zu öffnen. Sie sollten zum Hallo-Bildschirm gelangen, ohne sich anzumelden.

Stellen Sie die Federsicherheit ein

Lassen Sie uns nun verhindern, dass Benutzer, die nicht angemeldet sind, den Hallo-Bildschirm anzeigen.

Wenn der Benutzer mit den aktuellen Spezifikationen auf den Link auf dem Startbildschirm klickt, wird sofort der Hallo-Bildschirm aufgerufen. Verwenden Sie Spring Security, um dies so zu ändern, dass es erst nach der Anmeldung angezeigt wird.

Fügen Sie der POM-Datei die folgenden Abhängigkeiten hinzu.

pom.xml


<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-test</artifactId>
  <scope>test</scope>
</dependency>

Erstellen Sie als Nächstes eine WebSecurityConfig.java-Datei unter src / main / java / com / example / securingweb mit den folgenden Inhalten.

WebSecurityConfig.java


package com.example.securingweb;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http
			.authorizeRequests()
                                // "/", "/home"Ist für alle Benutzer zugänglich
				.antMatchers("/", "/home").permitAll()
                                //Für andere Zugriffe ist eine Authentifizierung erforderlich
				.anyRequest().authenticated()
				.and()
                        //Alle Benutzer können auf Login und Logout zugreifen
			.formLogin()
				.loginPage("/login")
				.permitAll()
				.and()
			.logout()
				.permitAll();
	}

	@Bean
	@Override
	public UserDetailsService userDetailsService() {
		UserDetails user =
                         //Geben Sie den Standardbenutzernamen und das Standardkennwort an
			 User.withDefaultPasswordEncoder()
				.username("user")
				.password("password")
				.roles("USER")
				.build();

		return new InMemoryUserDetailsManager(user);
	}
}

@EnableWebSecurity Es ist eine Anmerkung, die die Sicherheitsfunktion verwenden kann.

permitAll() Eine Methode, die allen Benutzern den Zugriff ermöglicht. Im Gegenteil, es erlaubt keinen anonymen Zugriff.

authenticated() Dies ist eine Methode zum Anfordern der Authentifizierung.

UserDetailsService überschreibt die UserDetailsService-Klasse, um Benutzereinstellungen anzugeben.

Jetzt kann nur der angemeldete Benutzer zum Hallo-Bildschirm wechseln.

Erstellen Sie als Nächstes eine Anmeldeseite. Erstellen Sie eine login.html-Datei unter src / main / resources / templates.

login.html


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
      xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Spring Security Example </title>
    </head>
    <body>
        <div th:if="${param.error}">
            Invalid username and password.
        </div>
        <div th:if="${param.logout}">
            You have been logged out.
        </div>
        <form th:action="@{/login}" method="post">
            <div><label> User Name : <input type="text" name="username"/> </label></div>
            <div><label> Password: <input type="password" name="password"/> </label></div>
            <div><input type="submit" value="Sign In"/></div>
        </form>
    </body>
</html>

$ {param.error} und $ {param.logout} erhalten die Fehler- und Abmeldeparameter. Wenn der Fehler wahr ist, wird eine Fehlermeldung angezeigt, und wenn die Abmeldung wahr ist, wird eine Abmeldemeldung angezeigt.

Zeigen Sie abschließend Ihren aktuellen Benutzernamen an, damit Sie sich abmelden können. Begrüßen Sie dazu den aktuellen Benutzer in hello.html und lassen Sie ihn das Abmeldeformular anzeigen.

Bearbeiten Sie nun hello.html mit den folgenden Inhalten.

hello.html


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
      xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Hello World!</title>
    </head>
    <body>
        <h1 th:inline="text">Hello 
//Holen Sie sich den Benutzernamen und zeigen Sie ihn auf dem Bildschirm an
[[${#httpServletRequest.remoteUser}]]!</h1>
        <form th:action="@{/logout}" method="post">
            <input type="submit" value="Sign Out"/>
        </form>
    </body>
</html>

Das Abmeldeformular wird an / logout gesendet. Wenn Sie sich abmelden, werden Sie zu / login? Logout weitergeleitet.

Fügen Sie abschließend ein wenig zu SecuringWebApplication.java hinzu, um die App auszuführen. Bearbeiten Sie SecuringWebApplication.java unter src / main / java / com / example / securingweb mit den folgenden Inhalten.

SecuringWebApplication.java


package com.example.securingweb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SecuringWebApplication {

	public static void main(String[] args) throws Throwable {
		SpringApplication.run(SecuringWebApplication.class, args);
	}

}

Führe es nochmals aus

Versuchen Sie, die App mit dem folgenden Befehl zu starten.

./mvnw spring-boot:run

Öffnen Sie nach dem Start http: // localhost: 8080. Klicken Sie auf den Link, um zur ersten Seite zu gelangen. スクリーンショット 2020-07-16 11.01.08.png

Klicken Sie hier, um zum Anmeldebildschirm zu gelangen. Geben Sie "Benutzer" in Benutzername und "Passwort" in Passwort ein. スクリーンショット 2020-07-16 11.02.54.png

Ich konnte mich einloggen.

スクリーンショット 2020-07-16 11.03.48.png

Wenn Sie für Benutzername und Passwort unterschiedliche eingeben, wird es ordnungsgemäß abgespielt. スクリーンショット 2020-07-16 11.03.21.png

Klicken Sie auf die Schaltfläche Abmelden, um Ihre Authentifizierung zu widerrufen und mit einer Abmeldemeldung zur Anmeldeseite zurückzukehren. スクリーンショット 2020-07-16 11.04.07.png

Recommended Posts

Spring Boot Tutorial Verwenden der Spring Security-Authentifizierung
Versuchen Sie es mit Spring Boot Security
Erreichen Sie die BASIC-Authentifizierung mit Spring Boot + Spring Security
Informationen zur Spring Security-Authentifizierung
Versuchen Sie die LDAP-Authentifizierung mit Spring Security (Spring Boot) + OpenLDAP
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Aufgabenplan für das Spring Boot Tutorial
Spring Security-Nutzungsnotiz Authentifizierung / Autorisierung
Verwenden Sie die Standardauthentifizierung mit Spring Boot
Implementierte Authentifizierungsfunktion mit Spring Security ②
Implementierte Authentifizierungsfunktion mit Spring Security ③
Implementierte Authentifizierungsfunktion mit Spring Security ①
Erfahren Sie mehr über die Architektur der Spring Security-Authentifizierungsverarbeitung
Zertifizierung / Autorisierung mit Spring Security & Thymeleaf
Teil 1: Versuchen Sie, die von Spring Security 5 unterstützte OAuth 2.0-Anmeldung mit Spring Boot zu verwenden
Setzen Sie das Spring Security-Authentifizierungsergebnis auf JSON
DB-Authentifizierung mit Spring Security und Hashing mit BCrypt
Versuchen Sie es mit Spring Boot mit VS-Code
Der Spring Boot @ WebMvcTest-Test aktiviert die Standardsicherheit von Spring Security
Asynchrone Verarbeitung mit Spring Boot unter Verwendung von @Async
[Tutorial] Spring Batch
Fordern Sie Spring Boot heraus
Spring Boot Form
Spring Boot Denken Sie daran
gae + frühlingsstiefel
Hash-Passwörter mit Spring Boot + Spring Security (mit Salt, mit Stretching)
[FCM] Implementierung der Nachrichtenübertragung mit FCM + Spring Boot
Erstellen Sie eine Spring Boot-Anwendung mit IntelliJ IDEA
Fügen Sie mit Spring Security Ihre eigenen Authentifizierungselemente hinzu
Wenden Sie Twitter Bootstrap 4 mithilfe von Webjars auf Spring Boot 2 an
Erstellen Sie mit Spring Boot 2.0 einen Spring Cloud Config Server mit Sicherheit
Testen von JPA-Entitäten und -Repositorys mit Spring Boot @DataJpaTest
Führen Sie nach der Standardauthentifizierung mit Spring Boot eine beliebige Verarbeitung aus.
Versuchen Sie es mit einem DI-Container mit Laravel und Spring Boot
SPRING BOOT Lernaufzeichnung 01
[Ich habe es versucht] Spring Tutorial
[Hinweis] Festlegen der Datei bei Verwendung von Logback mit Spring Boot
Frühlingsstiefel + Heroku Postgres
Schreiben von Frühlingsstiefel-Memos (1)
Versuchen Sie, OpenID Connect mit Keycloak (Spring Boot-Anwendung) zu verwenden.
Verwendungshinweis zu Spring Security: Zusammenarbeit mit Spring MVC und Boot
[JUnit 5-kompatibel] Schreiben Sie einen Test mit JUnit 5 mit Spring Boot 2.2, 2.3
Erster Frühlingsstiefel (DI)
SPRING BOOT Lernprotokoll 02
Spring Boot2 Spickzettel
Spring Boot mit Spring Security Filter-Einstellungen und Suchtpunkten
Spring Boot-Ausnahmebehandlung
Implementieren Sie eine einfache Rest-API mit Spring Security mit Spring Boot 2.0
Spring Boot Servlet-Zuordnung
Spring Boot Entwicklung-Entwicklungsumgebung-
Spring Boot-Lernverfahren
Spring Security erhöht 403 verboten
[Einführung in Spring Boot] Senden Sie ein Formular mit thymeleaf
Spring Boot lernen [Anfang]
Schreiben von Spring Boot-Memos (2)
Spring Boot 2.2 Dokumentzusammenfassung
Testen Sie die Klasse mit Feldinjektion im Spring-Boot-Test, ohne den Spring-Container zu verwenden