Poursuivant l'article précédent [Essayez d'automatiser la migration avec Spring Boot Flyway], essayez d'implémenter le processus de connexion.
build.gradle Ajoutez ** spring-boot-starter-security **.
build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '2.3.1.BUILD-SNAPSHOT'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'com.avast.gradle.docker-compose' version '0.12.1'
id 'org.flywaydb.flyway' version '6.4.3'
}
// ...Abréviation
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.flywaydb:flyway-core'
implementation "org.springframework.boot:spring-boot-starter-security" //ajouter à
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'mysql:mysql-connector-java'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testImplementation 'org.springframework.security:spring-security-test' //ajouter à
}
Créez dans la même hiérarchie que ** Application **.
SecurityConfig.java
package com.example;
import org.springframework.beans.factory.annotation.Autowired;
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.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import javax.sql.DataSource;
//Classe de paramètre de sécurité
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//Encodeur de mot de passe
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Autowired
private DataSource dataSource;
//Instruction SQL pour obtenir l'utilisateur
private static final String USER_SQL = "SELECT"
+ " email,"
+ " password,"
+ " true"
+ " FROM"
+ " users"
+ " WHERE"
+ " email = ?";
//Instruction SQL pour obtenir des autorisations
private static final String ROLE_SQL = "SELECT"
+ " email,"
+ " role"
+ " FROM"
+ " users"
+ " WHERE"
+ " email = ?";
@Override
public void configure(WebSecurity web) throws Exception {
//N'appliquez pas de sécurité pour accéder aux ressources statiques
web.ignoring().antMatchers("/resources/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//Paramètres des pages qui ne nécessitent pas de connexion
http.authorizeRequests()
.antMatchers("/resources/**");
//L'accès à d'autres pages est refusé
.anyRequest().authenticated();
//Paramètres du formulaire de connexion
http.formLogin()
//Nom du paramètre utilisateur
.usernameParameter("email")
//Nom du paramètre de mot de passe
.passwordParameter("password");
//Désactiver les mesures CSRF
http.csrf().disable();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//Obtenir les informations utilisateur de DB pendant le processus de connexion
auth.jdbcAuthentication()
.dataSource(dataSource)
.usersByUsernameQuery(USER_SQL)
.authoritiesByUsernameQuery(ROLE_SQL)
.passwordEncoder(passwordEncoder());
}
}
Remplacez le mot de passe par une chaîne codée. La chaîne d'origine est ** passw0rd **.
R__1_insert_datas.sql
INSERT INTO `users` VALUES
(1,'Yamada','Hanako','[email protected]','$2a$06$hY5MzfruCds1t5uFLzrlBuw3HcrEGeysr9xJE4Cml5xEOVf425pmK',NULL,NOW(),NULL,NULL,NULL,NULL,1),
(2,'Suzuki','Taro','[email protected]','$2a$06$hY5MzfruCds1t5uFLzrlBuw3HcrEGeysr9xJE4Cml5xEOVf425pmK',NULL,NOW(),NULL,NULL,NULL,NULL,1);
Si vous avez déjà démarré docker. Exécutez ./gradlew composeDown
une fois pour supprimer tous les conteneurs, etc.
$ ./gradlew composeDown
> Task :composeDown
Stopping todoDb ...
Stopping todoDb ... done
Removing todoDb ...
Removing todoDb ... done
Removing network eb415214cdb915cc9f956bc6e963ac23_spring-boot-todo-sample__default
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.4.1/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 4s
1 actionable task: 1 executed
Redémarrez le docker avec ./gradlew composeUp
et créez une base de données.
Puis démarrez l'application avec ./graldew bootRun
.
[Article précédent ** application.yml **](https://qiita.com/megumi_622/items/c38100ca5b266e301643#applicationyml%E3%82%92%E4%BD%9C%E6%88%90%E3%81 Vous pouvez vérifier l'écran de connexion avec le numéro de port spécifié dans server.port de% 99% E3% 82% 8B).
Si vous accédez à l'URL suivante, vous serez redirigé vers ** / login **. http://localhost:18082
Étant donné que la page après la connexion n'est pas spécifiée, une page vierge s'affiche après la connexion. Nom d'utilisateur: [email protected] ou [email protected] Mot de passe: passw0rd
La prochaine fois, j'écrirai l'enregistrement des utilisateurs et le processus d'édition.
Recommended Posts