Tres formas de configurar el nombre de usuario y la contraseña para la autenticación de usuario de SpringSecurity

Tres formas de configurar el nombre de usuario y la contraseña para la autenticación de usuario de SpringSecurity

Primero comprenda el significado de algunas palabras:

Autenticación: autenticación

AuthenticationManagerBuilder: Generador del administrador de autenticación

codificador: compilador

PasswordEncoder: compilador de contraseñas

Autenticación de usuario predeterminada de Spring Security

Primero echemos un vistazo a cuál es el nombre de usuario y la contraseña si se usa la autenticación de usuario predeterminada de Spring Security.

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

1. Autenticación de usuario mediante archivo de configuración

Inserte la descripción de la imagen aquí

Echemos un vistazo a la clase de configuración automática SecurityAutoConfiguration.class, como se muestra a continuación.

Inserte la descripción de la imagen aquí

Echemos un vistazo a la clase SecurityProperties.class, como se muestra a continuación:

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

2. Autenticación de usuario mediante clase de configuración

Primero, la clase de configuración necesita heredar la clase de adaptador WebSecurityConfigurerAdapter. La clase WebSecurityConfigurerAdapter es un adaptador. Al configurar, necesitamos escribir una clase de configuración para heredarla, y luego escribir nuestra propia configuración de necesidades especiales.

Inserte la descripción de la imagen aquí

También puede almacenar información de múltiples usuarios y sus permisos en la memoria al mismo tiempo, simplemente use el método y () para conectarse entre información de múltiples usuarios.

 // 自定义配置认证规则
    @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");

    }

No hay PasswordEcoder asignado para el ID "nulo" 异常

Causa de anormalidad

Lo siguiente se centra en la excepción No hay PasswordEcoder asignado para la identificación "nula" mencionada en la figura anterior, y habla sobre sus soluciones:

Se han agregado una variedad de métodos de cifrado a Spring Security 5.0 y también se ha cambiado el formato de contraseña predeterminado.

Echemos un vistazo a la documentación oficial:

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

** Este pasaje significa que el formato de almacenamiento de las contraseñas en Spring Security es "{id} …………". La identificación al frente es el método de cifrado, y la identificación puede ser bcrypt, sha256, etc., seguida de cifrado En otras palabras, cuando el programa obtiene la contraseña pasada, primero buscará la identificación incluida por "{" y "}" para determinar cómo se cifra la contraseña, si no se puede encontrar Creo que la identificación es nula. ** Esta es la razón por la que nuestro programa informará un error: No hay PasswordEncoder asignado para la identificación "nula". El ejemplo en el documento oficial es un formulario de almacenamiento donde se cifran varios métodos de cifrado para la misma contraseña. La contraseña original es "contraseña".

Solución

Necesitas modificar el código en configure.Necesitamos encriptar la contraseña pasada desde el front-end de alguna manera.La recomendación oficial de Spring Security es usar encriptación bcrypt.

Contraseña de acceso en memoria

Es tal 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 ()) ", que es equivalente a usar el cifrado BCrypt para procesar las contraseñas de los usuarios al iniciar sesión. El" .password ("123") "anterior" se convierte en ".password (nuevo BCryptPasswordEncoder () .encode ("123")) ", que es equivalente a la codificación Bcrypt y el cifrado de la contraseña en la memoria. Si la contraseña es la misma en comparación, significa que la contraseña es correcta antes de que se permita el inicio de sesión.

Resumen: cuando el usuario inicia sesión para la autenticación de usuario, la contraseña de la interfaz se cifrará con cifrado BCrpt. El formato de contraseña cifrada es {id} contraseña, y luego el programador obtendrá primero el método de cifrado, que es {id} , Suponiendo que el passwordEncoder (new BCryptPasswordEncoder ()) no está escrito, entonces el valor transmitido desde el front-end no se cifrará con el cifrado BCrpt, por lo que el programador no puede encontrar el {id} en la contraseña al obtener el valor transmitido desde el front-end. Cifrado, por lo que informará No hay PasswordEcoder asignado para la excepción de id "nulo". passwordEncoder (new BCryptPasswordEncoder ()) puede entenderse como decirle al sistema qué método de cifrado se utiliza para cifrar los datos desde la interfaz. Suponiendo que el passwordEncoder (nuevo BCryptPasswordEncoder ()) es usado en el programa, la contraseña encriptada por bcrypt será comparada con la contraseña encriptada por bcrypt almacenada en la memoria. Si es la misma, entonces se comparará la contraseña ingresada por el usuario y la contraseña en la memoria. Si las contraseñas son las mismas, se permite el inicio de sesión.

Interfaz PasswordEncoder

Inserte la descripción de la imagen aquí

BCryptPasswordEncoder es la clase de implementación de la interfaz PasswordEncoder
Inserte la descripción de la imagen aquí

Al cifrar la contraseña, debe llamar al método de codificación de la clase de implementación relevante, como BCryptPasswordEncoder. Cuando el usuario inicia sesión, se llamará automáticamente al método de coincidencias para comparar la contraseña.

3. Realice la autenticación del usuario mediante la escritura personalizada de la clase de implementación de los detalles del usuario (es necesario consultar la base de datos)

Tabla en la base de datos

Primero observe la tabla de usuarios en la base de datos, como se muestra a continuación:

Inserte la descripción de la imagen aquí

Clase de entidad de bean de Java correspondiente a la tabla en la base de datos

Inserte la descripción de la imagen aquí

Clase de implementación específica del usuario basada en la personalización de la base de datos

La clase de implementación personalizada específica del usuario es la siguiente:

Inserte la descripción de la imagen aquí

Interfaz UserDetailsService

Inserte la descripción de la imagen aquí

Clase de configuración Spring Security

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_45950109/article/details/111444476
Recomendado
Clasificación