[JAVA] [Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security

Zweck

Für diejenigen, die mit der Arbeit an Spring Quickstart Guide fertig sind, diejenigen, die angefangen haben, Spring Boot zu lernen, und diejenigen, die eine Überprüfung durchführen möchten

Teilen Sie mit, was Sie gelernt haben, indem Sie tatsächlich am offiziellen Handbuch Sichern einer Webanwendung arbeiten.

Überprüfen Sie das ausgefüllte Formular. Es gibt eine Top-Seite, klicken Sie hier, スクリーンショット 2020-07-13 11.59.12.png

Gehen Sie zur Anmeldeseite. Geben Sie den Benutzernamen und das Kennwort für den Testbenutzer ein und klicken Sie auf die Schaltfläche Anmelden. スクリーンショット 2020-07-13 11.59.27.png

Sie werden zu einer Seite weitergeleitet, die nur von authentifizierten Personen angezeigt werden kann. Sie können nicht auf diesen Bildschirm zugreifen, wenn Sie nicht angemeldet sind. スクリーンショット 2020-07-13 12.00.36.png

Die Entwicklungsumgebung und die Überprüfung sind wie folgt.

Entwicklungsumgebung


Betriebssystem: macOS Mojave Version 10.14.6
Texteditor: Visual Studio Code (im Folgenden VSCode)
Java: 11.0.2

QuickstartGuide Erstellen eines RESTful-Webdienstes Konsumieren eines RESTful-Webdienstes Zugriff auf Daten mit JPA Übermittlung des Formulars Sichern einer Webanwendung

1. Starten Sie das Spring Boot Projekt!

Gehen Sie zunächst zu spring initializr.

  1. Klicken Sie auf die Schaltfläche ADD DEPENDENCIES und fügen Sie "Spring Web" und "Thymeleaf" hinzu. 2.Artifact, Name geändert in "Sichern-Web".
  2. Ändern Sie "Java" in "11".

Klicken Sie dann auf die Schaltfläche "GENERATE", um die Zip-Datei herunterzuladen.

スクリーンショット 2020-07-13 13.17.09.png

Extrahieren Sie die heruntergeladene Zip-Datei und Sie können loslegen.

2. Code hinzufügen!

Öffnen Sie den vorherigen Ordner mit VS Code. Wir empfehlen, das Java Extension Pack für Erweiterungen zu installieren. Es wird gesagt, dass Sie es installieren sollten.

スクリーンショット 2020-06-30 10.08.25.png

Lassen Sie uns home.html erstellen!

Erstellen Sie eine home.html-Datei in src / main / resources / templates /.

スクリーンショット 2020-07-13 13.29.09.png

Fügen Sie den Code hinzu, der sich auf die Formel bezieht. Es wird die oberste Seite sein.

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>

Der HTML-Tag-Teil dient zum Schreiben von th: 〇〇 und sec: 〇〇 (eine Beschreibungsmethode unter Verwendung von Thymeleaf- und Spring Security-Tags ist möglich).

Lassen Sie uns nun die Beschreibung von Thymeleaf im hinzugefügten Code genauer untersuchen.

thymeleaf ist eine Template-Engine, die von springboot verarbeitet werden kann. Beschrieben als th: 〇〇. [Thymeleaf-Tutorial] in japanischer Sprache (https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf_ja.html#thymeleaf%E3%81%AE%E7%B4%B9%E4%BB%) Es gibt auch 8B)!

th:href

Dieses Tag wird im href-Attribut des a-Tags festgelegt. Die Beschreibungsmethode lautet th: href =" @ {} ". Geben Sie den Pfad in {} an. Diesmal ist es "/ hello". Wenn Sie also auf das Tag klicken, wechselt es zu "http: // localhost: 8080 / hello".

Lassen Sie uns hello.html erstellen!

Erstellen Sie eine hello.html-Datei in src / main / resources / templates /.

スクリーンショット 2020-07-13 14.21.54.png

Fügen Sie den Code hinzu, der sich auf die Formel bezieht.

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 [[${#httpServletRequest.remoteUser}]]!</h1>
    <form th:action="@{/logout}" method="post">
      <input type="submit" value="Sign Out"/>
    </form>
  </body>
</html>

th: inline dient zum Erweitern des Werts einer Variablen im Text des Tags. Fügen Sie die Variablen, die Sie anzeigen möchten, in [[...]] ein. Dieses Mal ist es "$ {# httpServletRequest.remoteUser}", sodass der Name des authentifizierten Benutzers angezeigt wird.

Wenn Sie auf die Schaltfläche "Abmelden" klicken, werden Sie zu "/ login? Logout" weitergeleitet.

Lassen Sie uns MvcConfig.java erstellen!

Erstellen Sie eine MvcConfig.java-Datei in src / main / java / com / example / securingweb /.

スクリーンショット 2020-07-13 14.43.27.png

Fügen Sie den Code hinzu, der sich auf die Formel bezieht.

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 Annotation ** @ Configuration ** wird der Klasse gegeben, damit verschiedene Einstellungen von Spring in Java-Code ausgeführt werden können. (Klasse einstellen) Ich habe eine MvcConfig-Klasse erstellt, die die WebMvcConfigurer-Schnittstelle implementiert und die addViewControllers-Methode überschreibt.

registry.addViewController("/home").setViewName("home");

Anstatt einen anderen Controller zu haben und die Annotation "@ GetMapping" zu verwenden, um den Ansichtsnamen zurückzugeben Durch die obige Beschreibung

Wenn die URL "http: // localhost: 8080 / home" lautet, wird auf die Vorlage ** home.html ** verwiesen. Es scheint, dass die URL und die Vorlage zugeordnet sind. Wir werden login.html später implementieren.

Fügen Sie Spring Security zu pom.xml hinzu!

Fügen Sie pom.xml Folgendes hinzu, um Spring Security zu verwenden.

Spring Security ist ein Framework zum Hinzufügen von Sicherheitsfunktionen zu Webanwendungen. Bietet umfassende Unterstützung für die Authentifizierung, Autorisierung und den Schutz vor häufigem Missbrauch.

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>

スクリーンショット_2020-07-13_15_32_20.png

Lassen Sie uns WebSecurityConfig.java erstellen!

Erstellen Sie eine WebSecurityConfig.java-Datei in src / main / java / com / example / securingweb /.

スクリーンショット 2020-07-13 15.48.47.png

Fügen Sie den Code hinzu, der sich auf die Formel bezieht.

WebSecurityConfig.java


package com.example.securingweb;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;


@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
      .authorizeRequests()
        .antMatchers("/", "/home").permitAll()
        .anyRequest().authenticated()
        .and()
      .formLogin()
        .loginPage("/login")
        .permitAll()
        .and()
      .logout()
        .permitAll();
  }

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {

    String password = passwordEncoder().encode("password");

    auth.inMemoryAuthentication()
        .passwordEncoder(passwordEncoder())
        .withUser("user").password(password).roles("USER");
  }

  @Bean
  public PasswordEncoder passwordEncoder() {
      return new BCryptPasswordEncoder();
  }

}

Wir werden uns eingehender mit dem hinzugefügten Code befassen.

① Vererbung der Klassen @ EnableWebSecurity und WebSecurityConfigurerAdapter

WebSecurityConfig.java


@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  //Kürzung
}

Spring Security wird durch Hinzufügen der Annotation "@ EnableWebSecurity" aktiviert. Und es erbt eine abstrakte Klasse namens "WebSecurityConfigurerAdapter". Überschreiben Sie die ** configure-Methode ** in dieser Klasse Wir werden implementieren, ob der Seitenzugriff eingeschränkt werden soll oder nicht.

② Legen Sie Einschränkungen für den Seitenzugriff fest

WebSecurityConfig.java


@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .authorizeRequests()
      .antMatchers("/", "/home").permitAll() //URLs, für die keine Zugriffsbeschränkungen erforderlich sind
      .anyRequest().authenticated()  //Andere URLs erfordern eine Authentifizierung. Sie können nur darauf zugreifen, wenn Sie authentifiziert sind
      .and()
    .formLogin()
      .loginPage("/login") //Keine Zugriffsbeschränkungen auf dem Anmeldebildschirm
      .permitAll() //Keine Authentifizierung erforderlich
      .and()
    .logout()
      .permitAll(); //Keine Authentifizierung erforderlich
}

Überschreiben der ** Konfigurationsmethode **. HttpSecurity wird als Argument empfangen und ist eine Methode zum Beschreiben der Einstellungen für den Teil, der sich auf die http-Anforderung bezieht. Legt fest, ob beim Anmelden, Abmelden oder beim Zugriff auf andere Seiten eine Authentifizierung erforderlich ist.

③ Benutzereinstellungen zur Authentifizierung

Die Implementierung dieses Teils wurde als veraltet bezeichnet, wenn Sie den offiziellen Leitfaden befolgten. Es hat also eine etwas andere Implementierung.

WebSecurityConfig.java



@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

//Passwort verschlüsseln
String password = passwordEncoder().encode("password");

//Einstellungen für die In-Memory-Authentifizierung
auth.inMemoryAuthentication()
    .passwordEncoder(passwordEncoder())
    .withUser("user").password(password).roles("USER");
}

@Bean
public PasswordEncoder passwordEncoder() {
  return new BCryptPasswordEncoder();
}

** PasswordEncoder passwordEncoder () ** definiert eine Methode zum Hashing von Passwörtern. Dann wird das Passwort der Zeichenkette mit "String password = passwordEncoder (). Encode (" password ");" gehasht.

AuthenticationManagerBuilder ist eine Klasse, die die speicherinterne Authentifizierung aktiviert.

python


//Einstellungen für die In-Memory-Authentifizierung
auth.inMemoryAuthentication()
    .passwordEncoder(passwordEncoder())
    .withUser("user").password(password).roles("USER");
}

Wir implementieren es hier und setzen den Benutzer auf Authentifizierung.

Lassen Sie uns login.html erstellen!

Erstellen Sie eine login.html-Datei in src / main / resources / templates /.

スクリーンショット 2020-07-14 10.45.45.png

Fügen Sie den Code hinzu, der sich auf die Formel bezieht. Es wird die Anmeldeseite sein.

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>

In einem Feld können Sie den Benutzernamen und das Passwort eingeben. th: if =" $ {param.error} ist der Bereich, der angezeigt wird, wenn die Benutzerauthentifizierung fehlschlägt. th: if =" $ {param.logout} ist der Bereich, der beim Abmelden angezeigt wird (angezeigt, nachdem die Schaltfläche Abmelden in hello.html gedrückt wurde).

3. Lass es uns laufen!

Nachdem die Anwendung nun ausgeführt werden kann, überprüfen wir sie.

Geben Sie den folgenden Befehl in das Terminal ein und drücken Sie die Eingabetaste.

Terminal


$ ./mvnw spring-boot:run

Die obere Seite wird angezeigt.

スクリーンショット 2020-07-14 13.34.37.png

Klicken Sie hier, um zur Anmeldeseite zu gelangen. スクリーンショット 2020-07-14 13.34.52.png

Geben Sie einen geeigneten Benutzernamen und ein Passwort ein und klicken Sie auf die Schaltfläche Anmelden. スクリーンショット 2020-07-14 13.37.30.png

Die Anmeldeseite wird erneut angezeigt und die Fehlermeldung wird ebenfalls angezeigt. Geben Sie als Nächstes "Benutzer" in den Benutzernamen und "Passwort" in das Passwort ein und klicken Sie auf die Schaltfläche "Anmelden".

スクリーンショット 2020-07-14 13.39.23.png

Ich konnte zu einer Seite wechseln, die nur von authentifizierten Personen angezeigt werden kann. スクリーンショット 2020-07-14 13.39.23.png

Wenn Sie auf die Schaltfläche Abmelden klicken,

スクリーンショット 2020-07-14 13.41.36.png

Sie werden zur Anmeldeseite weitergeleitet und sehen eine Nachricht.

Danke für deine harte Arbeit. erledigt!

Referenzseite

** Alternative zu veraltet für User.withDefaultPasswordEncoder () ** ** [Spring Security wurde gestartet] # 2 Benutzerauthentifizierung ** ** "Hallo Welt!" Mit Frühlingssicherheit **

Recommended Posts

[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Implementierte Authentifizierungsfunktion mit Spring Security ②
Implementierte Authentifizierungsfunktion mit Spring Security ③
Implementierte Authentifizierungsfunktion mit Spring Security ①
Erreichen Sie die BASIC-Authentifizierung mit Spring Boot + Spring Security
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
Einführung in Spring Boot ~ ~ DI ~
Einführung in Spring Boot ② ~ AOP ~
Anmeldefunktion mit Spring Security
Einführung in Spring Boot Teil 1
Spring Boot Tutorial Verwenden der Spring Security-Authentifizierung
Zertifizierung / Autorisierung mit Spring Security & Thymeleaf
Setzen Sie das Spring Security-Authentifizierungsergebnis auf JSON
[Einführung in Spring Boot] Überprüfung der Formularvalidierung
DB-Authentifizierung mit Spring Security und Hashing mit BCrypt
Implementieren Sie die Paging-Funktion mit Spring Boot + Thymeleaf
Einführung in Spring Boot x Offene API ~ Offene API, erstellt mit Generationslückenmuster ~
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.
Informationen zur Spring Security-Authentifizierung
Hash-Passwörter mit Spring Boot + Spring Security (mit Salt, mit Stretching)
So lesen Sie Request Body mit Spring Boot + Spring Security mehrmals
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
Verwendung des eingebauten h2db mit Federstiefel
Einführung in Spring Boot + In-Memory Data Grid
Versuchen Sie, die Migration mit Spring Boot Flyway zu automatisieren
Ich wollte Spring Boot in einem Multiprojekt gradle
Mit Spring Boot herunterladen
Erstellen Sie mit Spring Boot 2.0 einen Spring Cloud Config Server mit Sicherheit
Erstellen Sie mit Spring Security eine Anmelde- / Abmeldefunktion gemäß dem offiziellen Spring-Leitfaden [für Anfänger].
Einstellungen für die Verbindung zu MySQL mit Spring Boot + Spring JDBC
Führen Sie nach der Standardauthentifizierung mit Spring Boot eine beliebige Verarbeitung aus.
Ordnen Sie DTO automatisch Entitäten mit der Spring Boot-API zu
Spring Boot mit Spring Security Filter-Einstellungen und Suchtpunkten
[Einführung in Spring Boot] Senden Sie ein Formular mit thymeleaf
Booten nach Umgebung mit Spring Boot of Maven
Versuch, SSR Vue.js mit Spring Boot und GraalJS zu verwenden
Versuchen Sie, mit Keycloak mit Spring Security SAML (Spring 5) zu arbeiten.
Versuchen Sie Spring Boot von 0 bis 100.
Generieren Sie mit Spring Boot einen Barcode
Hallo Welt mit Spring Boot
Implementieren Sie GraphQL mit Spring Boot
Java zum Spielen mit Function
Beginnen Sie mit Spring Boot
Einführung in Ratpack (7) - Guice & Spring
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
Datei-Upload mit Spring Boot
Spring Boot beginnt mit dem Kopieren
Hallo Welt mit Spring Boot
Erste Schritte mit Spring Boot
Versuchen Sie es mit Spring Boot Security
Erstellen Sie mit Spring Boot einen Mikrodienst
Mail mit Spring Boot verschicken
Über die Funktion von Spring Boot aufgrund unterschiedlicher Versionen
Schneiden Sie SQL in die Eigenschaftendatei mit jdbcTemplate von Spring Boot aus
Stellen Sie mit spring boot + spring jpa eine Verbindung zur Datenbank her und führen Sie die CRUD-Operation durch
Fluss bis zur Ausgabe von Tabellendaten, die mit Spring Boot angezeigt werden sollen
Ich habe versucht, mit Swagger mit Spring Boot zu beginnen
Implementieren Sie eine einfache Rest-API mit Spring Security & JWT mit Spring Boot 2.0