Répertoire d'articles
- Trois façons de définir le nom d'utilisateur et le mot de passe pour l'authentification des utilisateurs SpringSecurity
-
- Comprenez d'abord le sens de quelques mots:
- Authentification utilisateur par défaut de Spring Security
- 1. Authentification de l'utilisateur via le fichier de configuration
- 2. Authentification des utilisateurs via la classe de configuration
- 3. Effectuer l'authentification utilisateur en écrivant la classe d'implémentation des détails utilisateur personnalisée (besoin d'interroger la base de données)
Trois façons de définir le nom d'utilisateur et le mot de passe pour l'authentification des utilisateurs SpringSecurity
Comprenez d'abord le sens de quelques mots:
Authentification: authentification
AuthenticationManagerBuilder: Générateur d'authentification Manager
encodeur: compilateur
PasswordEncoder: compilateur de mot de passe
Authentification utilisateur par défaut de Spring Security
Voyons d'abord quel est le nom d'utilisateur et le mot de passe si l'authentification utilisateur par défaut de Spring Security est utilisée?
1. Authentification de l'utilisateur via le fichier de configuration
Jetons un coup d'œil à la classe de configuration automatique SecurityAutoConfiguration.class, comme indiqué ci-dessous
Jetons un coup d'œil à la classe SecurityProperties.class, comme indiqué ci-dessous:
2. Authentification des utilisateurs via la classe de configuration
Tout d'abord, la classe de configuration doit hériter de la classe d'adaptateur WebSecurityConfigurerAdapter. La classe WebSecurityConfigurerAdapter est un adaptateur. Lors de la configuration, nous devons écrire une classe de configuration pour l'hériter, puis écrire notre propre configuration des besoins spéciaux.
Vous pouvez également stocker plusieurs informations utilisateur et leurs autorisations dans la mémoire en même temps, utilisez simplement la méthode and () pour vous connecter entre plusieurs informations utilisateur.
// 自定义配置认证规则
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("zhangsan").password("12345").roles("SuperAdmin")
.and()
.withUser("lisi").password("12345").roles("Admin")
.and()
.withUser("wangwu").password("12345").roles("Employee");
}
Il n'y a pas de PasswordEcoder mappé pour l'id "null" 异常
Cause de l'anomalie
Ce qui suit se concentre sur Il n'y a pas de PasswordEcoder mappé pour l'exception d'id "null" mentionnée dans la figure ci-dessus, et décrit ses solutions:
Une variété de méthodes de cryptage ont été ajoutées à Spring Security 5.0, et le format de mot de passe par défaut a également été modifié.
Jetons un œil à la documentation officielle:
The general format for a password is:
{id}encodedPassword
Such that id is an identifier used to look up which PasswordEncoder should be used and encodedPassword is the original encoded password for the selected PasswordEncoder. The id must be at the beginning of the password, start with { and end with }. If the id cannot be found, the id will be null. For example, the following might be a list of passwords encoded using different id. All of the original passwords are "password".
{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
{noop}password
{pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc
{scrypt}$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc=
{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0
** Ce passage signifie que le format de stockage des mots de passe dans Spring Security est "{id} …………". L'identifiant devant est la méthode de cryptage, et l'identifiant peut être bcrypt, sha256, etc., suivi du cryptage C'est-à-dire que lorsque le programme obtient le mot de passe passé, il cherchera d'abord l'id inclus par "{" et "}" pour déterminer comment le mot de passe est chiffré, s'il ne peut pas être trouvé Je pense que l'id est nul. ** C'est pourquoi notre programme signalera une erreur: il n'y a pas de PasswordEncoder mappé pour l'id "null". L'exemple dans le document officiel est une forme de stockage où diverses méthodes de cryptage sont cryptées pour le même mot de passe. Le mot de passe d'origine est "mot de passe".
Solution
Vous devez modifier le code dans configure.Nous devons crypter le mot de passe transmis par le frontal d'une certaine manière.La recommandation officielle de Spring Security est d'utiliser le cryptage bcrypt.
Accéder au mot de passe en mémoire
Est telle que:
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//inMemoryAuthentication 从内存中获取
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser("user1").password(new BCryptPasswordEncoder().encode("123")).roles("USER");
}
inMemoryAuthentication (). passwordEncoder (new BCryptPasswordEncoder ()) ", ce qui équivaut à utiliser le cryptage BCrypt pour traiter les mots de passe des utilisateurs lors de la connexion. L'ancien" .password ("123") "devient" .password (new BCryptPasswordEncoder () .encode ("123")) ", ce qui équivaut au codage Bcrypt et au chiffrement du mot de passe dans la mémoire. Si le mot de passe est le même en comparaison, cela signifie que le mot de passe est correct avant que la connexion ne soit autorisée.
Résumé: lorsque l’utilisateur se connecte pour l’authentification de l’utilisateur, le mot de passe du serveur frontal sera chiffré avec le chiffrement BCrpt. Le format du mot de passe chiffré est {id} mot de passe, puis le programmeur obtiendra d’abord la méthode de chiffrement, qui est {id} , En supposant que passwordEncoder (new BCryptPasswordEncoder ()) n'est pas écrit, alors la valeur transmise depuis le frontal ne sera pas chiffrée avec le chiffrement BCrpt, de sorte que le programmeur ne peut pas trouver l '{id} dans le mot de passe lors de l'obtention de la valeur transmise depuis le front-end. Chiffré, donc il signalera Il n'y a pas de PasswordEcoder mappé pour l'exception d'id "null". passwordEncoder (new BCryptPasswordEncoder ()) peut être compris comme indiquant au système quelle méthode de cryptage est utilisée pour crypter les données depuis le frontal. En supposant que le passwordEncoder (new BCryptPasswordEncoder ()) est utilisé dans le programme, le mot de passe chiffré par bcrypt sera comparé au mot de passe chiffré par bcrypt stocké dans la mémoire. Dans le cas contraire, le mot de passe saisi par l'utilisateur et le mot de passe en mémoire seront comparés. Si les mots de passe sont identiques, la connexion est autorisée.
Interface PasswordEncoder
BCryptPasswordEncoder est la classe d'implémentation de l'interface PasswordEncoder
Lors du chiffrement du mot de passe, vous devez appeler la méthode d'encode de la classe d'implémentation appropriée, telle que BCryptPasswordEncoder. Lorsque l'utilisateur se connecte, la méthode matches sera automatiquement appelée pour la comparaison des mots de passe.
3. Effectuer l'authentification utilisateur en écrivant la classe d'implémentation des détails utilisateur personnalisée (besoin d'interroger la base de données)
Table dans la base de données
Regardez d'abord la table des utilisateurs dans la base de données, comme indiqué ci-dessous:
Classe d'entité du bean Java correspondant à la table de la base de données
Classe d'implémentation spécifique à l'utilisateur basée sur la personnalisation de la base de données
La classe d'implémentation personnalisée spécifique à l'utilisateur est la suivante: