Registro com Spring Security - Codificação de Senha

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.

Read more

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.

Read more

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.

Read more

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á.