[JAVA] Authentification DB avec Spring Security et hachage avec BCrypt

Aperçu

Environnement de développement

Présentation de Spring Security

Sélectionnez les 4 suivants dans la dépendance


Décrire les informations de connexion à la base de données dans le fichier de propriétés

application.properties


spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/[Nom de la base de données]
spring.datasource.username=[Nom d'utilisateur DB]
spring.datasource.password=[mot de passe]
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

Créer un tableau d'informations utilisateur

create table USER_TABLE (
    USER_ID VARCHAR2(30 char)
  , FAMILY_NAME VARCHAR2(10 char) not null
  , FIRST_NAME VARCHAR2(10 char) not null
  , PASSWORD VARCHAR2(255) not null
  , constraint USER_TABLE_PKC primary key (USER_ID)
) ;

Enregistrement des données

Le mot de passe ci-dessous est un hachage de «pass». J'ai fait référence à cet article.

INSERT INTO
    USER_TABLE
VALUES(
    '0001'
   ,'tester'
   ,'Taro'
   ,'$2a$10$w0C4tFU.SLFATC1Y6Y4uy.vMYsLXhlfvgnFP4dLbRjEa6/Ag1csKS'
   );

Créer une classe d'entité

UserTable.java


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "USER_TABLE")
public class UserTable {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "USER_ID")
	private String userId;

	@Column(name = "FAMILY_NAME")
	private String familyName;

	@Column(name = "FIRST_NAME")
	private String firstName;

	@Column(name = "PASSWORD")
	private String password;

// Getter,Setter omis


Créer un référentiel

UserTableRepository.java


import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.azkz.entity.UserTable;

@Repository
public interface UserTableRepository extends JpaRepository<UserTable, String> {

	public UserTable findByUserId(String userId);

}

Créer SecurityConfig

DemoSecurityConfig.java


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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class DemoSecurityConfig extends WebSecurityConfigurerAdapter {

	//Une méthode pour limiter l'URL accessible et spécifier la destination de la transition lorsque la connexion est réussie
	@Override
	protected void configure(HttpSecurity httpSecurity) throws Exception {
		httpSecurity.authorizeRequests()
				.mvcMatchers("/").permitAll() // 「/Accessible à tous
				.anyRequest().authenticated() //Sinon, vous devez vous connecter
				.and()
				.formLogin()
				.defaultSuccessUrl("/success"); //Une fois la connexion réussie, "/Faire une demande Get pour "succès"
	}

	//Une méthode pour hacher le mot de passe entré à l'aide de la méthode BCrypt
	@Bean
	protected PasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}
}

Créer UserDetailsService

DemoUserDetailsService.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import com.azkz.entity.UserTable;
import com.azkz.repository.UserTableRepository;

@Service
public class DemoUserDetailsService implements UserDetailsService {

	@Autowired
	UserTableRepository userTableRepository;

	@Override
	public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException {

		//Obtenir des données de la base de données en fonction de l'ID utilisateur saisi
		UserTable userTable = userTableRepository.findByUserId(userId);

		//Entrez les valeurs (ID utilisateur, mot de passe) et la classe DemoUserDetails instanciée
		//La vérification de connexion est effectuée en comparant à l'intérieur de Spring Security.
		return new DemoUserDetails(userTable);

	}

}

Créer les détails de l'utilisateur

DemoUserDetails.java


import java.util.Collections;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.User;

import com.azkz.entity.UserTable;

public class DemoUserDetails extends User {

	@Autowired
	UserTable userTable;

	public DemoUserDetails(UserTable userTable) {
		// 「Collections.emptySet()Est à l'origine une collection de noms d'autorité. Cette fois, c'est vide.
		super(userTable.getUserId(), userTable.getPassword(),Collections.emptySet());
		this.userTable = userTable;
	}

	//Obtenez vos propres éléments à partir des informations de session

	public String getFirstName() {
		return this.userTable.getFirstName();
	}

	public String getFamilyName() {
		return this.userTable.getFamilyName();
	}

}

Créer un contrôleur

DemoController.java


import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.azkz.security.DemoUserDetails;

@RestController
public class DemoController {

	@GetMapping("/success")
	public DemoUserDetails loginSuccess() {
		//Obtenez des informations sur les utilisateurs connectés
		DemoUserDetails demoUserDetails =
				(DemoUserDetails) SecurityContextHolder
									.getContext().getAuthentication().getPrincipal();

		return demoUserDetails;
	}
}

Vérification d'écran

Accédez à http: // localhost: 8080 / login

2020-03-15-19-24-53.png


Connexion réussie

2020-03-15-19-26-25.png


Erreur d'authentification

2020-03-15-19-28-26.png


À la fin

Recommended Posts

Authentification DB avec Spring Security et hachage avec BCrypt
Mise en œuvre de la fonction d'authentification avec Spring Security ②
Mise en œuvre de la fonction d'authentification avec Spring Security ①
Certification / autorisation avec Spring Security & Thymeleaf
Obtenez une authentification BASIC avec Spring Boot + Spring Security
Essayez l'authentification LDAP avec Spring Security (Spring Boot) + OpenLDAP
Ajoutez vos propres éléments d'authentification avec Spring Security
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Fonction de connexion avec Spring Security
Authentification / autorisation de mémo d'utilisation de Spring Security
Utiliser l'authentification de base avec Spring Boot
Tutoriel Spring Boot à l'aide de l'authentification Spring Security
Découvrez l'architecture de traitement de l'authentification Spring Security
Authentification Oauth2 avec Spring Cloud Gateway
Une erreur 404 se produit lors du test de l'authentification par formulaire avec Spring Security
Utiliser les balises JSP Spring Security avec FreeMarker
Comment Spring Security fonctionne avec Hello World
Hash des mots de passe avec Spring Boot + Spring Security (avec sel, avec étirement)
Mettre à jour périodiquement la base de données avec Spring Batch et My Batis
Créez un serveur Spring Cloud Config en toute sécurité avec Spring Boot 2.0
Mémo d'utilisation de Spring Security: coopération avec Spring MVC et Boot
Implémentez une API Rest simple avec Spring Security avec Spring Boot 2.0
Gérer le mot de passe haché avec BCryptPasswordEncoder de Spring Security en Perl
Créez un site de démonstration simple avec Spring Security avec Spring Boot 2.1
Essayez de travailler avec Keycloak en utilisant Spring Security SAML (Spring 5)
Appelez votre propre méthode avec PreAuthorize dans Spring Security
Créer une authentification par clé API pour l'API Web dans Spring Security
Un nouvel employé a tenté de créer une fonction d'authentification / autorisation à partir de zéro avec Spring Security
Spring Security soulève 403 interdits
Validation personnalisée avec Spring
Printemps avec Kotorin ―― 1. INITIALISATION PRINTEMPS
Télécharger avec Spring Boot
Application Spring Boot qui spécifie les paramètres de connexion à la base de données avec des paramètres
Implémentez une API Rest simple avec Spring Security & JWT avec Spring Boot 2.0
Connectez-vous avec HttpServletRequest # login dans Spring Security dans l'environnement Servlet 3.x