Trois façons de définir le nom d'utilisateur et le mot de passe pour l'authentification des utilisateurs SpringSecurity

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?

Insérez la description de l'image ici

Insérez la description de l'image ici

1. Authentification de l'utilisateur via le fichier de configuration

Insérez la description de l'image ici

Jetons un coup d'œil à la classe de configuration automatique SecurityAutoConfiguration.class, comme indiqué ci-dessous

Insérez la description de l'image ici

Jetons un coup d'œil à la classe SecurityProperties.class, comme indiqué ci-dessous:

Insérez la description de l'image ici

Insérez la description de l'image ici

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.

Insérez la description de l'image ici

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

Insérez la description de l'image ici

BCryptPasswordEncoder est la classe d'implémentation de l'interface PasswordEncoder
Insérez la description de l'image ici

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:

Insérez la description de l'image ici

Classe d'entité du bean Java correspondant à la table de la base de données

Insérez la description de l'image ici

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:

Insérez la description de l'image ici

Interface UserDetailsService

Insérez la description de l'image ici

Classe de configuration Spring Security

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/qq_45950109/article/details/111444476
conseillé
Classement