1
resposta

Trocar senha por Data de Nascimento

Teria algum jeito de criar um Record que utilizaria o Email ou Usuario e o que seria validado seria a Data de nascimento do Usuário?

1 resposta

Olá Pedro! Como vai?

Isso é um pouco diferente do padrão de autenticação que normalmente utiliza uma senha. No entanto, é possível implementar isso com algumas considerações de segurança.

Para criar um Record que armazene o e-mail ou nome de usuário junto com a data de nascimento, você pode fazer algo assim:

public record UserCredentials(String emailOrUsername, LocalDate dateOfBirth) {}

No entanto, para implementar a autenticação com base na data de nascimento, você precisará ajustar a lógica de autenticação no Spring Security. Aqui está um esboço de como você poderia fazer isso:

  1. Crie um serviço de autenticação personalizado: este serviço verificará se o e-mail ou nome de usuário e a data de nascimento correspondem aos registros do banco de dados.

  2. Configure o Spring Security para usar seu serviço personalizado: você precisará ajustar a configuração de segurança para utilizar seu serviço de autenticação personalizado.

  3. Considere a segurança: autenticar usando apenas a data de nascimento pode não ser seguro, pois essa informação pode ser facilmente obtida. Considere adicionar camadas adicionais de segurança, como autenticação multifator.

Aqui está um exemplo simplificado de como você poderia configurar um serviço de autenticação personalizado:

@Service
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Autowired
    private UserRepository userRepository;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String emailOrUsername = authentication.getName();
        LocalDate dateOfBirth = (LocalDate) authentication.getCredentials();

        User user = userRepository.findByEmailOrUsername(emailOrUsername);
        if (user != null && user.getDateOfBirth().equals(dateOfBirth)) {
            return new UsernamePasswordAuthenticationToken(emailOrUsername, dateOfBirth, new ArrayList<>());
        } else {
            throw new BadCredentialsException("Invalid credentials");
        }
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
    }
}

E na configuração de segurança:

@Configuration
@EnableWebSecurity
public class SecurityConfigurations extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomAuthenticationProvider customAuthenticationProvider;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(customAuthenticationProvider);
    }

    // Outras configurações...
}

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.