[JAVA] Tutoriel Spring Boot à l'aide de l'authentification Spring Security

J'ai créé une page Web avec un formulaire sécurisé en me référant au tutoriel officiel de Spring Boot (Protecting Web Applications (https://spring.io/guides/gs/securing-web/)).

environnement

Maven 3.6.3 (OK pour Maven 3.2 ou version ultérieure) Système d'exploitation: macOS Mojave version 10.14.6 Éditeur de texte: VSCode Java: 11.0.2

Créer

Ouvrez Spring Initializr et créez une fondation avec le contenu suivant. Cette fois, nous ajouterons "Spring Web" et "Thymeleaf" comme dépendances. スクリーンショット 2020-07-15 11.17.56.png

Décompressez le fichier zip résultant et ouvrez-le dans un éditeur.

Vérifions pom.xml. Le contenu du fichier pom créé automatiquement est le suivant.

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>

Tout d'abord, créons une application Web qui n'est protégée par rien. La structure est aussi simple que d'afficher l'écran d'accueil et "Hello World".

Créez à partir de l'écran d'accueil. Créez un fichier home.html sous src / main / resources / templates. Le contenu est le suivant.

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>

Ensuite, créez un écran d'accueil. Créez un fichier hello.html sous src / main / resources / templates. Le contenu est le suivant.

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>

À l'exception de la balise html, c'est un hrml normal. Cela sera à nouveau modifié lors de la mise en œuvre de la sécurité.

Ensuite, créez un fichier MvcConfig.java sous src / main / java / com / example / securingweb. Le contenu est le suivant.

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

}

La classe WebMvcConfigurer héritée par la classe MvcConfig remplace la méthode addViewControllers, donc si vous créez une telle classe Config, vous pouvez réaliser la configuration MVC sans créer de contrôleur.

@Configuration vous permet de configurer divers paramètres pour Spring. De plus, dans la classe Configuration, ajoutez @Configuration à la classe.

Maintenant, exécutons l'application. Rien n'est sûr à ce stade.

Courir

Exécutez la commande suivante.

./mvnw spring-boot:run

Une fois lancé, essayez d'ouvrir http: // localhost: 8080 / hello dans votre navigateur. Vous devriez accéder à l'écran d'accueil sans vous connecter.

Définir la sécurité Spring

Maintenant, empêchons les utilisateurs qui ne sont pas connectés d'afficher l'écran d'accueil.

Avec les spécifications actuelles, lorsque l'utilisateur clique sur le lien sur l'écran d'accueil, il passe immédiatement à l'écran d'accueil. Utilisons Spring Security pour changer cela afin qu'il n'apparaisse qu'après la connexion.

Ajoutez les dépendances suivantes au fichier pom.

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>

Ensuite, créez un fichier WebSecurityConfig.java sous src / main / java / com / example / securingweb avec le contenu suivant.

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"Est accessible à tous les utilisateurs
				.antMatchers("/", "/home").permitAll()
                                //L'autre accès nécessite une authentification
				.anyRequest().authenticated()
				.and()
                        //Tous les utilisateurs peuvent accéder à la connexion et à la déconnexion
			.formLogin()
				.loginPage("/login")
				.permitAll()
				.and()
			.logout()
				.permitAll();
	}

	@Bean
	@Override
	public UserDetailsService userDetailsService() {
		UserDetails user =
                         //Spécifiez le nom d'utilisateur et le mot de passe par défaut
			 User.withDefaultPasswordEncoder()
				.username("user")
				.password("password")
				.roles("USER")
				.build();

		return new InMemoryUserDetailsManager(user);
	}
}

@EnableWebSecurity C'est une annotation qui peut utiliser la fonction de sécurité.

permitAll() Une méthode qui permet l'accès à tous les utilisateurs. Au contraire, il n'autorise pas l'accès anonyme.

authenticated() C'est une méthode pour demander l'authentification.

UserDetailsService remplace la classe UserDetailsService pour spécifier les paramètres utilisateur.

Désormais, seul l'utilisateur connecté peut accéder à l'écran d'accueil.

Ensuite, créez une page de connexion. Créez un fichier login.html sous 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} et $ {param.logout} obtiennent les paramètres d'erreur et de déconnexion. Si l'erreur est vraie, un message d'erreur s'affiche et si la déconnexion est vraie, un message de déconnexion s'affiche.

Enfin, affichez votre nom d'utilisateur actuel afin de pouvoir vous déconnecter. Pour ce faire, saluez l'utilisateur actuel dans hello.html et demandez-lui d'afficher le formulaire de déconnexion.

Maintenant, modifiez hello.html avec le contenu suivant.

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 
//Obtenez le nom d'utilisateur et affichez-le à l'écran
[[${#httpServletRequest.remoteUser}]]!</h1>
        <form th:action="@{/logout}" method="post">
            <input type="submit" value="Sign Out"/>
        </form>
    </body>
</html>

Le formulaire de déconnexion POST / déconnexion Lorsque vous vous déconnectez, vous serez redirigé vers / login? Logout.

Enfin, ajoutez un peu à SecuringWebApplication.java pour exécuter l'application. Modifiez SecuringWebApplication.java sous src / main / java / com / example / securingweb au contenu suivant.

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

}

Courez à nouveau

Essayez de démarrer l'application avec la commande suivante.

./mvnw spring-boot:run

Une fois démarré, ouvrez http: // localhost: 8080. Cliquez sur le lien pour accéder à la première page. スクリーンショット 2020-07-16 11.01.08.png

Cliquez ici pour passer à l'écran de connexion. Tapez ʻuser dans le nom d'utilisateur et mot de passe` dans le mot de passe. スクリーンショット 2020-07-16 11.02.54.png

J'ai pu me connecter.

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

Si vous entrez des noms différents pour le nom d'utilisateur et le mot de passe, il sera lu correctement. スクリーンショット 2020-07-16 11.03.21.png

Cliquez sur le bouton Déconnexion pour révoquer votre authentification et revenir à la page de connexion avec un message de déconnexion. スクリーンショット 2020-07-16 11.04.07.png

Recommended Posts

Tutoriel Spring Boot à l'aide de l'authentification Spring Security
Essayez d'utiliser Spring Boot Security
Obtenez une authentification BASIC avec Spring Boot + Spring Security
À propos de l'authentification Spring Security
Essayez l'authentification LDAP avec Spring Security (Spring Boot) + OpenLDAP
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Calendrier des tâches du didacticiel Spring Boot
Authentification / autorisation de mémo d'utilisation de Spring Security
Utiliser l'authentification de base avec Spring Boot
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 ①
Découvrez l'architecture de traitement de l'authentification Spring Security
Certification / autorisation avec Spring Security & Thymeleaf
Partie 1: Essayez d'utiliser la connexion OAuth 2.0 prise en charge par Spring Security 5 avec Spring Boot
Définissez le résultat de l'authentification Spring Security sur JSON
Authentification DB avec Spring Security et hachage avec BCrypt
Essayez d'utiliser Spring Boot avec VS Code
Le test Spring Boot @WebMvcTest active la sécurité par défaut de Spring Security
Traitement asynchrone avec Spring Boot en utilisant @Async
[Tutoriel] Spring Batch
Défi Spring Boot
Forme de botte de printemps
Spring Boot Rappelez-vous
gae + botte à ressort
Hash des mots de passe avec Spring Boot + Spring Security (avec sel, avec étirement)
[FCM] Implémentation de la transmission de messages en utilisant FCM + Spring boot
Créez une application Spring Boot à l'aide d'IntelliJ IDEA
Ajoutez vos propres éléments d'authentification avec Spring Security
Appliquer Twitter Bootstrap 4 à Spring Boot 2 à l'aide de Webjars
Créez un serveur Spring Cloud Config en toute sécurité avec Spring Boot 2.0
Test des entités et référentiels JPA à l'aide de Spring Boot @DataJpaTest
Exécutez un traitement arbitraire après l'authentification de base avec Spring Boot.
Essayez d'utiliser un conteneur DI avec Laravel et Spring Boot
Fiche d'apprentissage SPRING BOOT 01
[J'ai essayé] Tutoriel de printemps
[Note] Fichier de configuration lors de l'utilisation de Logback avec Spring Boot
Botte de printemps + Heroku Postgres
Rédaction de mémo de démarrage de printemps (1)
Essayez d'utiliser OpenID Connect avec Keycloak (application Spring Boot)
Mémo d'utilisation de Spring Security: coopération avec Spring MVC et Boot
[Compatible JUnit 5] Ecrire un test en utilisant JUnit 5 avec Spring boot 2.2, 2.3
Première botte à ressort (DI)
Fiche d'apprentissage SPRING BOOT 02
Aide-mémoire Spring Boot2
Spring Boot avec les paramètres du filtre de sécurité Spring et les points addictifs
Gestion des exceptions Spring Boot
Implémentez une API Rest simple avec Spring Security avec Spring Boot 2.0
Mappage du servlet Spring Boot
Environnement de développement-développement Spring Boot-
Procédure d'apprentissage Spring Boot
Spring Security soulève 403 interdits
[Introduction à Spring Boot] Soumettez un formulaire à l'aide de thymeleaf
Apprentissage de Spring Boot [Début]
Rédaction de mémos de démarrage de printemps (2)
Résumé du document Spring Boot 2.2
Testez la classe injectée sur le terrain dans le test de démarrage Spring sans utiliser le conteneur Spring