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/)).
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
Ouvrez Spring Initializr et créez une fondation avec le contenu suivant.
Cette fois, nous ajouterons "Spring Web" et "Thymeleaf" comme dépendances.
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.
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.
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);
}
}
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.
Cliquez ici pour passer à l'écran de connexion.
Tapez ʻuser dans le nom d'utilisateur et
mot de passe` dans le mot de passe.
J'ai pu me connecter.
Si vous entrez des noms différents pour le nom d'utilisateur et le mot de passe, il sera lu correctement.
Cliquez sur le bouton Déconnexion pour révoquer votre authentification et revenir à la page de connexion avec un message de déconnexion.
Recommended Posts