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