[JAVA] [Introduction à Spring Boot] Fonction d'authentification avec Spring Security

Objectif

Pour ceux qui ont terminé le Spring Quickstart Guide, ceux qui ont commencé à apprendre Spring Boot et ceux qui veulent le consulter.

Partagez ce que vous avez appris en travaillant sur le guide officiel Sécurisation d'une application Web.

Vérifiez le formulaire rempli. Il y a une page d'accueil, cliquez ici, スクリーンショット 2020-07-13 11.59.12.png

Accédez à la page de connexion. Saisissez le nom d'utilisateur et le mot de passe de l'utilisateur de test et cliquez sur le bouton Se connecter. スクリーンショット 2020-07-13 11.59.27.png

Vous serez redirigé vers une page qui ne peut être consultée que par des personnes authentifiées. Vous ne pouvez pas accéder à cet écran si vous n'êtes pas connecté. スクリーンショット 2020-07-13 12.00.36.png

L'environnement de développement et l'examen jusqu'à présent sont les suivants.

Environnement de développement


Système d'exploitation: macOS Mojave version 10.14.6
Éditeur de texte: Visual Studio Code (ci-après VSCode)
Java: 11.0.2

QuickstartGuide Création d'un service Web RESTful Utilisation d'un service Web RESTful Accès aux données avec JPA Traitement de la soumission du formulaire Sécurisation d'une application Web

1. Démarrez le projet Spring Boot!

Tout d'abord, accédez à spring initializr.

  1. Cliquez sur le bouton AJOUTER DES DÉPENDANCES et ajoutez «Spring Web» et «Thymeleaf». 2.Artifact, nom changé en sécurisation-web
  2. Remplacez Java par 11.

Cliquez ensuite sur le bouton GENERATE pour télécharger le fichier Zip.

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

Extrayez le fichier Zip téléchargé et vous êtes prêt à partir.

2. Ajoutez du code!

Ouvrez le dossier précédent avec VS Code. Nous vous recommandons d'installer le Java Extension Pack pour les extensions. Il est dit que vous devez l'installer.

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

Créons home.html!

Créez un fichier home.html dans src / main / resources / templates /.

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

Ajoutez le code faisant référence à la formule. Ce sera la première page.

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>

La partie balise html sert à écrire th: 〇〇 et sec: 〇〇 (une méthode de description utilisant les balises thymeleaf et Spring Security est possible).

Maintenant, approfondissons la description de thymeleaf dans le code ajouté.

thymeleaf est un moteur de template qui peut être géré par springboot. Th: Décrivez comme 〇〇. [Tutoriel Thymeleaf] écrit en japonais (https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf_ja.html#thymeleaf%E3%81%AE%E7%B4%B9%E4%BB% Il y a aussi 8B)!

th:href

Cette balise est définie dans l'attribut href de la balise a. La méthode de description est th: href =" @ {} ". Spécifiez le chemin à l'intérieur de {}. Cette fois c'est / hello, donc si vous cliquez sur la balise, elle passera à http: // localhost: 8080 / hello.

Créons hello.html!

Créez un fichier hello.html dans src / main / resources / templates /.

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

Ajoutez le code faisant référence à la formule.

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 sert à étendre la valeur d'une variable dans le texte de la balise. Placez les variables que vous souhaitez afficher dans «[...]]». Cette fois, il s'agit de $ {# httpServletRequest.remoteUser}, donc le nom de l'utilisateur authentifié est affiché.

Lorsque vous appuyez sur le bouton Déconnexion, vous serez redirigé vers / login? Déconnexion.

Créons MvcConfig.java!

Créez un fichier MvcConfig.java dans src / main / java / com / example / securingweb /.

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

Ajoutez le code faisant référence à la formule.

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");
  }

}

L'annotation ** @ Configuration ** est donnée à la classe afin que divers paramètres de Spring puissent être exécutés en code Java. (Classe de réglage) J'ai créé une classe MvcConfig qui implémente l'interface WebMvcConfigurer et remplace la méthode addViewControllers.

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

Au lieu d'avoir un autre contrôleur et d'utiliser l'annotation @ GetMapping pour renvoyer le nom de la vue Par la description ci-dessus

Lorsque l'URL est http: // localhost: 8080 / home, le modèle ** home.html ** sera référencé. Il semble que l'URL et le modèle soient mappés. Nous implémenterons login.html plus tard.

Ajoutez Spring Security à pom.xml!

Ajoutez ce qui suit à pom.xml pour utiliser Spring Security.

Spring Security est un cadre permettant d'ajouter des fonctionnalités de sécurité aux applications Web. Fournit un support complet pour l'authentification, l'autorisation et la protection contre les abus courants.

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

Créons WebSecurityConfig.java!

Créez un fichier WebSecurityConfig.java dans src / main / java / com / example / securingweb /.

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

Ajoutez le code faisant référence à la formule.

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();
  }

}

Nous approfondirons le code ajouté.

① Héritage des classes @ EnableWebSecurity et WebSecurityConfigurerAdapter

WebSecurityConfig.java


@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  //réduction
}

Spring Security est activé en ajoutant l'annotation @ EnableWebSecurity. Et il hérite d'une classe abstraite appelée WebSecurityConfigurerAdapter. Remplacez la ** méthode configure ** dans cette classe Nous mettrons en œuvre la possibilité de restreindre ou non l'accès aux pages.

② Définir les restrictions d'accès aux pages

WebSecurityConfig.java


@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .authorizeRequests()
      .antMatchers("/", "/home").permitAll() //URL qui ne nécessitent pas de restrictions d'accès
      .anyRequest().authenticated()  //D'autres URL nécessitent une authentification. Vous ne pouvez y accéder que si vous êtes authentifié
      .and()
    .formLogin()
      .loginPage("/login") //Aucune restriction d'accès sur l'écran de connexion
      .permitAll() //Aucune authentification requise
      .and()
    .logout()
      .permitAll(); //Aucune authentification requise
}

Remplacer la ** méthode de configuration **. HttpSecurity est reçu comme argument, et c'est une méthode pour décrire les paramètres de la partie liée à la requête http. Définit si l'authentification est requise lors de la connexion, de la déconnexion ou de l'accès à d'autres pages.

③ Paramètres utilisateur pour authentifier

La mise en œuvre de cette partie était dite obsolète si vous suiviez le guide officiel. Il a donc une implémentation légèrement différente.

WebSecurityConfig.java



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

//Encoder le mot de passe
String password = passwordEncoder().encode("password");

//Paramètres d'authentification en mémoire
auth.inMemoryAuthentication()
    .passwordEncoder(passwordEncoder())
    .withUser("user").password(password).roles("USER");
}

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

** PasswordEncoder passwordEncoder () ** définit une méthode de hachage des mots de passe. Et le mot de passe de la chaîne de caractères est haché dans la partie de String password = passwordEncoder (). Encode (" password ");.

AuthenticationManagerBuilder est une classe qui active l'authentification en mémoire.

python


//Paramètres d'authentification en mémoire
auth.inMemoryAuthentication()
    .passwordEncoder(passwordEncoder())
    .withUser("user").password(password).roles("USER");
}

Nous l'implémentons ici et configurons l'utilisateur pour s'authentifier.

Créons login.html!

Créez un fichier login.html dans src / main / resources / templates /.

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

Ajoutez le code faisant référence à la formule. Ce sera la page de connexion.

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>

Il y a un champ pour entrer le nom d'utilisateur et le mot de passe. th: if =" $ {param.error} ʻest la zone qui s'affiche lorsque l'authentification de l'utilisateur échoue. th: if =" $ {param.logout} ʻest la zone qui sera affichée lorsque vous vous déconnectez (affichée après avoir appuyé sur le bouton Déconnexion dans hello.html).

3. Lançons-le!

Maintenant que l'application est prête à fonctionner, vérifions.

Entrez la commande suivante dans le terminal et appuyez sur Entrée.

Terminal


$ ./mvnw spring-boot:run

La première page s'affiche.

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

Cliquez ici pour accéder à la page de connexion. スクリーンショット 2020-07-14 13.34.52.png

Saisissez un nom d'utilisateur et un mot de passe appropriés et appuyez sur le bouton Connexion. スクリーンショット 2020-07-14 13.37.30.png

La page de connexion s'affiche de nouveau et le message d'erreur s'affiche également. Ensuite, entrez ʻuser dans Nom d'Usr et Mot de passe` dans Mot de passe et appuyez sur le bouton Se connecter.

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

J'ai pu passer à une page qui ne peut être consultée que par des personnes authentifiées. スクリーンショット 2020-07-14 13.39.23.png

Lorsque vous appuyez sur le bouton Déconnexion,

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

Vous serez redirigé vers la page de connexion et vous verrez un message.

Je vous remercie pour votre travail acharné. terminé!

Site de référence

** Alternative à obsolète pour User.withDefaultPasswordEncoder () ** ** [Spring Security has started] # 2 User Authentication ** ** "Hello World!" Avec Spring Security **

Recommended Posts

[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Mise en œuvre de la fonction d'authentification avec Spring Security ②
Implémentez la fonction d'authentification avec Spring Security ③
Mise en œuvre de la fonction d'authentification avec Spring Security ①
Obtenez une authentification BASIC avec Spring Boot + Spring Security
Essayez d'implémenter la fonction de connexion avec Spring Boot
Introduction à Spring Boot ① ~ DI ~
Introduction à Spring Boot ② ~ AOP ~
Fonction de connexion avec Spring Security
Introduction à Spring Boot, partie 1
Tutoriel Spring Boot à l'aide de l'authentification Spring Security
Certification / autorisation avec Spring Security & Thymeleaf
Définissez le résultat de l'authentification Spring Security sur JSON
[Introduction à Spring Boot] Vérification de la validation du formulaire
Authentification DB avec Spring Security et hachage avec BCrypt
Implémenter la fonction de pagination avec Spring Boot + Thymeleaf
Introduction à Spring Boot x Open API ~ Open API créée avec le modèle d'écart de génération ~
Un nouvel employé a tenté de créer une fonction d'authentification / autorisation à partir de zéro avec Spring Security
Avec Spring Boot, hachez le mot de passe et utilisez l'enregistrement des membres et la sécurité Spring pour implémenter la fonction de connexion.
À propos de l'authentification Spring Security
Hash des mots de passe avec Spring Boot + Spring Security (avec sel, avec étirement)
Comment lire le corps de la requête plusieurs fois avec Spring Boot + Spring Security
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment utiliser h2db intégré avec Spring Boot
Introduction à Spring Boot + In-Memory Data Grid
Essayez d'automatiser la migration avec Spring Boot Flyway
Je voulais classer la botte à ressort dans un multi-projet
Télécharger avec Spring Boot
Créez un serveur Spring Cloud Config en toute sécurité avec Spring Boot 2.0
Créez une fonction de connexion / déconnexion avec Spring Security selon le guide officiel de Spring [pour les débutants]
Paramètres de connexion à MySQL avec Spring Boot + Spring JDBC
Exécutez un traitement arbitraire après l'authentification de base avec Spring Boot.
Mappez automatiquement DTO aux entités avec l'API Spring Boot
Spring Boot avec les paramètres du filtre de sécurité Spring et les points addictifs
[Introduction à Spring Boot] Soumettez un formulaire à l'aide de thymeleaf
Comment démarrer par environnement avec Spring Boot de Maven
Tentative de SSR Vue.js avec Spring Boot et GraalJS
Essayez de travailler avec Keycloak en utilisant Spring Security SAML (Spring 5)
Essayez Spring Boot de 0 à 100.
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Implémenter GraphQL avec Spring Boot
Java pour jouer avec Function
Démarrez avec Spring Boot
Introduction à Ratpack (7) --Guice & Spring
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Hello World avec Spring Boot
Premiers pas avec Spring Boot
Essayez d'utiliser Spring Boot Security
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
À propos de la fonction de Spring Boot en raison de différentes versions
Découpez SQL en fichier de propriété avec jdbcTemplate of spring boot
Connectez-vous à la base de données avec spring boot + spring jpa et effectuez l'opération CRUD
Flux jusqu'à la sortie des données de la table à afficher avec Spring Boot
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
Implémentez une API Rest simple avec Spring Security & JWT avec Spring Boot 2.0