[JAVA] Erstellen Sie mit Spring Security eine Anmelde- / Abmeldefunktion gemäß dem offiziellen Spring-Leitfaden [für Anfänger].

*** Ergänzung: Die Beschreibung in home.html und das Bild des Sukusho waren falsch, also habe ich es korrigiert. *** ***

Annahmen / Umwelt

Ich wollte mit Spring Security eine Login / Logout-Funktion erstellen, war aber süchtig nach verschiedenen Dingen und blieb ungefähr 2 Tage lang hängen. Schließlich habe ich beschlossen, es gemäß dem offiziellen Frühlingsführer zu machen. →https://spring.io/guides/gs/securing-web/

Da der ganze Satz auf Englisch ist, habe ich es geschafft, ihn beim Schreiben zu verstehen, während ich nach der Bedeutung gesucht habe, also werde ich ihn für Anfänger teilen.

Umgebung:

Erstellen Sie ein Projekt mit Spring Boot

Neu → Spring Starter Project Wählen und erstellen Sie mit den folgenden Elementen.

Das ist absolut! Das heißt nicht, aber ich denke, dass sich die Bewegung je nach Umgebung ändern wird. Deshalb denke ich, dass es besser für Leute ist, die vorerst kopieren und einfügen möchten.

Einführung in Spring Security

Lassen Sie uns nun das erstellte Projekt ändern.

Fügen Sie zunächst die Beschreibung "Ich werde Spring Security verwenden!" Zu pom.xml hinzu. (Spring macht es offiziell nach dem Erstellen der Hello World-Anwendung, aber dieses Mal werde ich es zuerst tun) Was ist pom.xml? Wenn ja, versuchen Sie es bitte mit Google. Grob gesagt ist pom.xml wie eine Maven-Konfigurationsdatei. (Entschuldigung, wenn ich falsch liege)

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 http://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.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>login-Training-SpringBoot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>login-Training-SpringBoot</name>
    <description>Demo project for Spring Boot</description>

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

    <dependencies>
        //Hier hinzufügen!
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <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>
        </dependency>
    </dependencies>

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

</project>

Zwischen <Abhängigkeiten> </ Abhängigkeiten>

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

Hinzufügen. Damit ist die Einstellung "Ich werde Spring Security verwenden!" Abgeschlossen.

Erstellen Sie zunächst eine nicht sichere Anwendung

Zunächst erstellen wir eine Anwendung, die Hello World ohne Sicherheit.

Home.html erstellen

Weil es die Thymeleaf-Vorlage verwendet

src/main/resources/templates/home.html

Erstellen Sie eine HTML-Datei unter dem Vorlagenordner, wie unten gezeigt.

home.html


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
	<head>
		<meta charset="UTF-8">
		<title>Hello,SpringSecurity!</title>
	</head>
	<body>
		<h1>WELCOME!</h1>
		<br>
        <p>Einloggen<a th:href="@{/hello}">Hier</a></p>
     <p><a th:href="@{/}">Neue Benutzerregistrierung</a></p>
	</body>
</html>
  1. Beschreibung im HTML-Tag: Erklärung zur Verwendung von Thymeleaf, Erklärung zur Verwendung von Sicherheit, XHTML-Namespace
  2. Link zu "/ hallo"

Zuerst über den Namespace. Ein Namespace ist ein "Namespace", der erstellt wurde, damit ein Computer eine Kombination mehrerer Vokabulare in XML identifizieren kann, wodurch die Auszeichnungssprache frei gestaltet werden kann. (buchstäblich) Es ist zu konzeptionell und schwer zu verstehen, Dieser Artikel ist über Namespaces leicht zu verstehen. Eine kurze Beschreibung des XML-Namespace

Die diesmal verwendeten "xmlns" werden als "XML-Namespace" bezeichnet, und es scheint, dass der Computer durch Kombinieren des Vokabeltyps und des URI identifiziert werden kann.

Ebenfalls,

In vielen Fällen wird das http: -Schema für den URI verwendet, der den Namespace angibt, sodass ich den Eindruck habe, dass etwas abgerufen werden kann. Dies ist jedoch in erster Linie die Rolle von "ID", wie der Name schon sagt. Bitte haben Sie Verständnis dafür, dass es erfüllt wird

Ich bin sicher, Sie denken, dass es hier eine Tag-Identifikations-ID ist.

Hier setzen wir den Standard-Namespace mit xmlns =" " Setzen von th: mitxmlns: th =" ", Das sec: wird mit xmlns: sec =" "` gesetzt.

Weiter ist der Link zu "/ hallo" Hier ist der Link in Thymeleaf-Notation veröffentlicht. Der @ {...} Teil des Attributs th: href ist das Linkziel. In diesem Fall bedeutet dies, dass es mit "localhost: 8080 / hello" verknüpft ist. (Obwohl der Link für die Registrierung neuer Benutzer ebenfalls beschrieben wird, wird er diesmal nicht implementiert, da er nur angezeigt und nicht implementiert wird.)

So schreiben Sie Thymeleaf Referenz: Beherrschen Sie Thymeleaf vollständig mit dem minimal erforderlichen Beispiel

[hello.html] Erstellen Sie jetzt hello.html, das den Link früher beschreibt.

hello.html


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <meta charset="UTF-8">
        <title>Hello,SpringSecurity!</title>
    </head>
    <body>
        <h3>Herzlich willkommen!</h3>
    </body>
</html>

Willkommen hier einmal! Einfach anzeigen.

Erstellen der MvcConfig-Klasse

Erstellen Sie als Nächstes eine Klasse zum Festlegen von MVC. src/main/java/hello/MvcConfig.java Platzieren in.

MvcConfig.java


package hello;

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");
    }
}
  1. Fügen Sie die Annotation @Configuration hinzu
  2. implementiert WebMvcConfigurer

Über Geräte: Implementiere eine Schnittstelle! Verwendung von Geräten in Java [Für Anfänger]

Grob gesagt Schnittstelle (Spezifikation) -> implementierte Klasse (fügen Sie die tatsächliche Definition in die Spezifikation ein) -> verwenden Sie diese Methode Es ist so ein Bild.

Wenden Sie Sicherheit auf Ihre Anwendung an

Erstellen Sie eine Sicherheitskonfigurationsklasse (WebSecurityConfig.java).

Erstellen Sie eine Konfigurationsklasse, die von der WebSecurityConfigurerAdapter-Klasse erbt. src/main/java/hello/WebSecurityConfig.java So arrangiert.

WebSecurityConfig.java


package hello;

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()
                // "/"Wann/home ist für alle benutzer zugänglich
                .antMatchers("/","/home").permitAll()
                //Für den Zugriff auf andere als die oben genannten Funktionen ist eine Authentifizierung erforderlich
                .anyRequest().authenticated()
                .and()
            //Anmelde- und Abmelde-URL-Spezifikationen und Berechtigungen für alle Benutzer
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Bean
    @Override
    public UserDetailsService userDetailsService() {
        UserDetails user =
                User.withDefaultPasswordEncoder()
                    .username("user")
                    .password("pass")
                    .roles("USER")
                    .build();
        return new  InMemoryUserDetailsManager(user);
    }
}
  1. Erben Sie den WebSecurityConfigurerAdapter
  2. Schreiben Sie die Annotation @EnableWebSecurity
  3. Definieren Sie den URL-Pfad und die Berechtigungen
  4. userDetailsService () verwendet die Annotation @Bean, um Benutzername und Kennwort festzulegen

Zunächst sollte die Vererbung beim Erstellen einer Klasse vererbt werden.

Also, @EnableWebSecurity, aber es scheint, dass Sie die WebSecurity-Funktion verwenden können, indem Sie dies schreiben. Nun, es ist eine Sicherheitsfunktion im Web! Das ist die Beschreibung. Die genaue Definition überlasse ich Google Sensei. ..

Bezüglich des URL-Pfads und der Zugriffsrechte, wie in den Kommentaren beschrieben. Erlaube allen Benutzern den Zugriff mit allowAll () Erfordert eine Authentifizierung mit authenticated () Ich fühle mich wie.

Schließlich der userDetailsService () Teil, Erstens ist @Bean dasselbe wie JavaBeans. Sie können die Bean eines Benutzers (konkreten Inhalt) mithilfe der Annotation @Bean generieren. Außerdem wird die UserDetailsService-Klasse überschrieben, in der Sie Ihren Benutzernamen und Ihr Kennwort angeben. Hier ist Benutzername Benutzername, Passwort ist Pass und Rolle ist USER.

Erstellen Sie login.html

login.html


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <meta charset="UTF-8">
        <title>LoginPage</title>
    </head>
    <body>
        <div th:if="${param.error}">
Der Benutzername oder das Passwort ist falsch
        </div>
        <div th:if="${param.logout}">
Abgemeldet
        </div>
        <form th:action="@{/login}" method="post">
            <div><label>Nutzername:<input type="text" name="username" /></label></div>
            <div><label>Passwort:<input type="password" name="password" /></label></div>
            <div><input type="submit" value="Einloggen" /></div>
        </form>
    </body>
</html>

src/main/resources/templates/login.html Erstellt in.

$ {param} ist ein unbekanntes Objekt, das als "implizites Objekt" bezeichnet wird. Um es grob zu erklären, erhält es die Parameter nach dem. (Punkt). (Suche nach "$ {param} EL Ausdruck") Sie können den Fehlerparameter also mit $ {param.error} abrufen. In diesem Fall wird, wenn der Fehler wahr ist, eine Fehlermeldung angezeigt, und wenn die Abmeldung wahr ist, wird eine entsprechende Meldung angezeigt.

Laut dem Spring-Beamten scheint es auch zu "/ login? Error" umzuleiten, wenn die Anmeldung fehlschlägt.

If the user fails to authenticate, the page is redirected to "/login?error" and our page displays the appropriate error message.

Übrigens scheint es notwendig zu sein, beim Schreiben von XML / am Ende des Eingabe-Tags hinzuzufügen. Grund für einen Fehler, wenn Sie in Spring Boot 2 nicht "/>" und Schrägstrich zum Eingabe-Tag hinzufügen

Zeigen Sie abschließend Ihren Benutzernamen und Ihren Abmeldelink in hello.html an

hello.html


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <meta charset="UTF-8">
        <title>Hello,SpringSecurity!</title>
    </head>
    <body>
        <h2>Hello!</h2>
        <h1 th:inline="text">Hello[[${#httpServletRequest.remoteUser}]]!</h1>
        <form th:action="@{/logout}" method="post">
            <input type="submit" value="Ausloggen" />
        </form>
        <p></p>
    </body>
</html>

Der Anzeigeteil des Körpers wurde neu geschrieben.

  1. Zeigen Sie den Benutzernamen mit "[[$ {# httpServletRequest.remoteUser}]]" an
  2. Erstellen Sie eine Abmeldeschaltfläche

Holen Sie sich den Benutzernamen in den Teil "[[$ {# httpServletRequest.remoteUser}]]" und zeigen Sie ihn auf dem Bildschirm an.

We display the username by using Spring Security’s integration with HttpServletRequest#getRemoteUser(). (Aus dem offiziellen Leitfaden)

Verwenden Sie hier die Methode getRemoteUser () von HttpServletRequest, um den Benutzernamen abzurufen! Ist geschrieben. Mit dieser Idee, Holen Sie sich remoteUser-Daten mit httpServletRequest Es ist so ein Bild. Soweit ich sehen kann, scheinen doppelte Klammern [[]] für die Datenkonvertierung zu stehen. Ich denke, das liegt daran, dass ich zwei Schritte mache: Holen Sie es sich → formatieren Sie es für die Ausgabe. Vielleicht.

Erstellen Sie eine Klasse zum Ausführen der Anwendung

Ich bin endlich da! Sie müssen lediglich Ihr Projekt für die Ausführung einrichten.

Offiziell wird im Hallo-Paket eine neue Ausführungsklasse Application.java erstellt, wobei jedoch davon ausgegangen wird, dass sie standardmäßig bereits im Paket com.example.demo enthalten ist ... Als ich es las, stand dort etwas wie "Was soll ich tun, wenn es im Hallo-Paket enthalten ist?". Also habe ich es für alle Fälle erstellt. (Es macht möglicherweise keinen Sinn, weil ich es nicht richtig übersetzt habe)

@ComponentScan tells Spring to look for other components, configurations, and services in the hello package, allowing it to find the controllers.

src/main/java/hello/Application.java Ich werde es schaffen.

Application.java


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <meta charset="UTF-8">
        <title>Hello,SpringSecurity!</title>
    </head>
    <body>
        <h2>Hello!</h2>
        <h1 th:inline="text">Hello[[${#httpServletRequest.remoteUser}]]!</h1>
        <form th:action="@{/logout}" method="post">
            <input type="submit" value="Ausloggen" />
        </form>
        <p></p>
    </body>
</html>

Ich denke, es ist in Ordnung, die Standardausführungsklasse zu löschen. Ich habe Angst, also habe ich den vollständigen Text w auskommentiert

Lauf!

Endlich fertig! Lass es uns jetzt laufen lassen.

Sie können es starten, indem Sie mit der rechten Maustaste auf das Projekt → Ausführen → Spring Boot-Anwendung klicken. Versuchen Sie danach den Zugriff, indem Sie "http: // localhost: 8080" in das URL-Eingabefeld Ihres Browsers eingeben.

home.html SS-home画面.PNG

Zunächst wurde der Startbildschirm ausgegeben. Sie können den Link zur Anmeldeseite sehen. Ich habe es noch nicht verwendet, aber die Registrierung neuer Benutzer wird ebenfalls angezeigt.

Drücken Sie Abmelden.

login.html SS-login画面.PNG

Sie sind zum Anmeldebildschirm übergegangen. Da die Benutzerinformationen "Abgemeldet" sind, werden sie als "Abgemeldet" angezeigt.

Als nächstes melden wir uns an, indem wir den von Ihnen angegebenen Benutzernamen (Benutzer) und das Kennwort (Pass) eingeben.

hello.html SS-hello画面.PNG

Ich konnte mich einloggen! Da der Benutzername "Benutzer" ist, ist es etwas schwer zu verstehen, aber es ist in Form von "Hallo + Benutzer +!".

Geben Sie nun den falschen Benutzernamen oder das falsche Passwort ein.

login.html SS-loginerror画面.PNG

Der Fehler wird korrekt angezeigt.

Hmm, es war so lang. Wenn dies nach dem Verständnis des Mechanismus möglich ist, ist die Anwendung wirksam.

Danke für deine harte Arbeit!

Recommended Posts

Erstellen Sie mit Spring Security eine Anmelde- / Abmeldefunktion gemäß dem offiziellen Spring-Leitfaden [für Anfänger].
Anmeldefunktion mit Spring Security
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 1
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 2
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 0
Neuer Mitarbeiter hat versucht, mit Spring Security eine Authentifizierungs- / Autorisierungsfunktion von Grund auf neu zu erstellen
Hash beim Spring-Boot das Passwort und verwenden Sie die Mitgliederregistrierung und die Spring-Sicherheit, um die Anmeldefunktion zu implementieren.
Implementierte Authentifizierungsfunktion mit Spring Security ③
Implementierte Authentifizierungsfunktion mit Spring Security ①
Versuchen Sie, eine Anmeldefunktion mit Spring-Boot zu implementieren
Implementierung der Anmeldefunktion durch Spring Security (securityConfig)
[Für Anfänger] So implementieren Sie die Löschfunktion
Erstellen Sie mit Spring Boot 2.0 einen Spring Cloud Config Server mit Sicherheit
Ich habe versucht, mit Java und Spring eine Funktion / einen Bildschirm für den Administrator einer Einkaufsseite zu erstellen
Einstellungen für die Verbindung zu MySQL mit Spring Boot + Spring JDBC
Erstellen Sie mit Spring Security 2.1 eine einfache Demo-Site mit Spring Security
Anfänger erstellen eine Spring Tools Suite-Umgebung mit VS Code
Versuchen Sie, mit Keycloak mit Spring Security SAML (Spring 5) zu arbeiten.
Erstellen Sie eine API-Schlüsselauthentifizierung für die Web-API in Spring Security
Melden Sie sich mit HttpServletRequest # in Spring Security in der Servlet 3.x-Umgebung an