Registro con Spring Security - Codificación de contraseña

Este artículo es parte de una serie: • Tutorial de registro de seguridad de Spring

• El proceso de registro con Spring Security

• Registro: active una nueva cuenta por correo electrónico

• Registro de seguridad de Spring: reenviar el correo electrónico de verificación

• Registro con Spring Security - Codificación de contraseña (artículo actual) • La API de registro se vuelve RESTful

• Spring Security: restablezca su contraseña

• Registro: seguridad y reglas de la contraseña

• Actualización de su contraseña

1. Información general

Este artículo analiza una parte fundamental del proceso de registro, la codificación de la contraseña , básicamente, no almacenar la contraseña en texto sin formato.

Hay algunos mecanismos de codificación compatibles con Spring Security, y para el artículo usaremos BCrypt , ya que suele ser la mejor solución disponible.

La mayoría de los otros mecanismos, como MD5PasswordEncoder y ShaPasswordEncoder, utilizan algoritmos más débiles y ahora están en desuso.

2. Defina el codificador de contraseña

Comenzaremos definiendo el BCryptPasswordEncoder simple como un bean en nuestra configuración:

@Bean public PasswordEncoder encoder() { return new BCryptPasswordEncoder(); }

Las implementaciones más antiguas, como SHAPasswordEncoder , requerirían que el cliente pasara un valor de sal al codificar la contraseña.

BCrypt, sin embargo, generará internamente una sal aleatoria en su lugar. Es importante comprender esto porque significa que cada llamada tendrá un resultado diferente, por lo que solo necesitamos codificar la contraseña una vez.

Para que esta generación de sal aleatoria funcione, BCrypt almacenará la sal dentro del valor hash. Por ejemplo, en el siguiente valor hash:

$2a$10$ZLhnHxdpHETcxmtEStgpI./Ri1mksgJ9iDP36FmfMdYyVg9g0b2dq

Hay tres campos separados por $:

  1. El "2a" representa la versión del algoritmo BCrypt
  2. El "10" representa la fuerza del algoritmo
  3. El "ZLhnHxdpHETcxmtEStgpI". parte es en realidad la sal generada aleatoriamente. Básicamente, los primeros 22 caracteres son sal. La parte restante del último campo es la versión hash real del texto sin formato

Además, tenga en cuenta que el algoritmo BCrypt genera una Cadena de longitud 60, por lo que debemos asegurarnos de que la contraseña se almacenará en una columna que pueda acomodarla. Un error común es crear una columna de diferente longitud y luego obtener un error de nombre de usuario o contraseña no válido en el momento de la autenticación.

3. Codifique la contraseña al registrarse

Ahora usaremos PasswordEncoder en nuestro UserService para codificar la contraseña durante el proceso de registro del usuario:

Ejemplo 3.1. - El UserServic e hash la contraseña

@Autowired private PasswordEncoder passwordEncoder; @Override public User registerNewUserAccount(UserDto accountDto) throws EmailExistsException { if (emailExist(accountDto.getEmail())) { throw new EmailExistsException( "There is an account with that email adress:" + accountDto.getEmail()); } User user = new User(); user.setFirstName(accountDto.getFirstName()); user.setLastName(accountDto.getLastName()); user.setPassword(passwordEncoder.encode(accountDto.getPassword())); user.setEmail(accountDto.getEmail()); user.setRole(new Role(Integer.valueOf(1), user)); return repository.save(user); }

4. Codifique la contraseña en la autenticación

Ahora manejemos la otra mitad de este proceso y codifiquemos la contraseña cuando el usuario se autentique.

Primero, necesitamos inyectar el bean codificador de contraseña que definimos anteriormente en nuestro proveedor de autenticación:

@Autowired private UserDetailsService userDetailsService; @Bean public DaoAuthenticationProvider authProvider() { DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); authProvider.setUserDetailsService(userDetailsService); authProvider.setPasswordEncoder(encoder()); return authProvider; }

La configuración de seguridad es simple:

  • estamos inyectando nuestra implementación del servicio de detalles de los usuarios
  • estamos definiendo un proveedor de autenticación que hace referencia a nuestro servicio de detalles
  • también estamos habilitando el codificador de contraseña

Y finalmente, necesitamos hacer referencia a este proveedor de autenticación en nuestra configuración XML de seguridad:

O, en caso de que esté utilizando la configuración de Java:

@Configuration @ComponentScan(basePackages = { "com.baeldung.security" }) @EnableWebSecurity public class SecSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(authProvider()); } ... }

5. Conclusión

Este tutorial rápido continúa la serie de Registro mostrando cómo almacenar correctamente la contraseña en la base de datos aprovechando la implementación de BCrypt simple pero muy potente.

La implementación completa de este tutorial de Registro con Spring Security se puede encontrar en GitHub.

Siguiente » La API de registro se vuelve RESTful « Registro de seguridad de Spring anterior - Reenviar correo electrónico de verificación