Registro com Spring Security - Codificação de Senha
1. Visão geral
Este artigo discute uma parte crítica do processo de registro -password encoding - basicamente não armazenar a senha em texto simples.
Existem alguns mecanismos de codificação suportados pelo Spring Security - e para o artigowe’ll use BCrypt, pois geralmente é a melhor solução disponível.
A maioria dos outros mecanismos, comoMD5PasswordEncodereShaPasswordEncoder, usam algoritmos mais fracos e agora estão obsoletos.
Leitura adicional:
Novo armazenamento de senha no Spring Security 5
Um guia rápido para entender a criptografia de senha no Spring Security 5 e migrar para melhores algoritmos de criptografia.
Permitir autenticação apenas de locais aceitos com Spring Security
Aprenda como permitir que os usuários se autentiquem apenas de locais aceitos com o Spring Security.
Spring Security - Usuário de login automático após o registro
Aprenda como autenticar rapidamente um usuário depois que ele concluir o processo de registro.
2. Defina o codificador de senha
Começaremos definindo o BCryptPasswordEncoder simples como um bean em nossa configuração:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
Implementações mais antigas - comoSHAPasswordEncoder - exigiriam que o cliente passasse um valor salt ao codificar a senha.
BCrypt, no entanto,will internally generate a random salt em vez disso. Isso é importante para entender porque significa que cada chamada terá um resultado diferente e, portanto, precisamos codificar a senha apenas uma vez.
Também esteja ciente de que o algoritmoBCrypt gera uma String de comprimento 60, portanto, precisamos ter certeza de que a senha será armazenada em uma coluna que possa acomodá-la. Um erro comum é criar uma coluna de comprimento diferente e obter um erroInvalid Username or Password no momento da autenticação.
3. Codifique a senha no registro
Agora usaremosPasswordEncoder em nossoUserService para hash a senha durante o processo de registro do usuário:
Exemplo 3.1 - O hash deUserService da senha
@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 a senha na autenticação
Agora vamos lidar com a outra metade desse processo e codificar a senha quando o usuário se autenticar.
Primeiro, precisamos injetar o bean codificador de senha que definimos anteriormente em nosso provedor de autenticação:
@Autowired
private UserDetailsService userDetailsService;
@Bean
public DaoAuthenticationProvider authProvider() {
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userDetailsService);
authProvider.setPasswordEncoder(encoder());
return authProvider;
}
A configuração de segurança é simples:
-
estamos injetando nossa implementação do serviço de detalhes dos usuários
-
estamos definindo um provedor de autenticação que referencia nosso serviço de detalhes
-
também estamos habilitando o codificador de senha
E, finalmente, precisamosreference this auth provider em nossa configuração XML de segurança:
Ou, caso você esteja usando a configuração Java:
@Configuration
@ComponentScan(basePackages = { "org.example.security" })
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authProvider());
}
...
}
5. Conclusão
Este tutorial rápido continua a série Registration, mostrando como armazenar corretamente a senha no banco de dados, alavancando a implementação BCrypt simples, mas muito poderosa.
Ofull implementation deste tutorial de Registro com Spring Security pode ser encontrado emthe GitHub project - este é um projeto baseado em Eclipse, portanto, deve ser fácil de importar e executar como está.