He creado una página de inicio de sesión en la que mencioné el enlace de contraseña olvidada que redirige al usuario a la página donde debe insertar la dirección de correo electrónico para recibir el token generado por el programa. Con la ayuda de este token, el usuario es redirigido a la página de cambio de contraseña donde puede cambiar su contraseña.

Ahora, mi preocupación es establecer el tiempo de vencimiento para ese token que está almacenado en la base de datos y debería eliminarse después de ese tiempo en particular. ¿Cómo puedo hacer esto usando Spring Boot?

Este controlador genera y guarda el token en la base de datos.

@RequestMapping(value = "/forgotPassword", method = RequestMethod.POST)
@ResponseBody
public String forgotPassword(HttpServletRequest request, String email) {

    Client user = clientService.getClientByEmail(email);
    if (user != null) {

        user.setConfirmationToken(UUID.randomUUID().toString());
        clientService.updateUser(user);

        String appUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();

        SimpleMailMessage registrationEmail = new SimpleMailMessage();
        registrationEmail.setTo(user.getEmail());
        registrationEmail.setSubject("Link Confirmation");
        registrationEmail.setText("Hi " + user.getFirstname()
                + ", To confirm your e-mail address and continue change password              , please  click to the belo link:\n"
                + appUrl + "/confirm/" + user.getConfirmationToken());
        // registrationEmail.setFrom("noreply@domain.com");

        emailService.sendEmail(registrationEmail);

        return "A confirmation e-mail has been sent to " + user.getEmail();

    } else
        return "email does not exitst with any user";
}

Este controlador redirige la página de cambio de contraseña cuando se hace clic en un token

@RequestMapping(value = "/confirm/{token}", method = RequestMethod.GET)
public ModelAndView confirmEmail(@PathVariable("token") String confirmationToken, Model m,Client c,Principal p) {
    ModelAndView mv=new ModelAndView();
    Client user = clientService.getClientByconfirmationToken(confirmationToken);

    if (p != null) {
        return new ModelAndView("redirect:/dashboard");
    }

    if (user != null ) {
        m.addAttribute("token",user.getConfirmationToken());
        mv.setViewName("/changePassword");
        return mv;

    } 

    else {
        mv.setViewName("redirect:/changePassword?invalidToken");
    }
        return mv;

}
0
SURAJ KUMAR 16 oct. 2018 a las 15:28

2 respuestas

La mejor respuesta

Habilite la programación en su clase principal de arranque de Spring usando @EnableScheduling y programe un trabajo para que se ejecute y se elimine de la tabla después de un tiempo.

@Component
public class ScheduleDeleteTokenJob {

@Autowired your repo

    @Scheduled(initialDelay = 1000, fixedDelay = 60000)  /there are more you can customize your job to run like cron...
    public void deleteToken() {
    //define your logic to delete token
     }
}

Vea más aquí para personalizar su trabajo EnableScheduling

Vea aquí la guía de ejemplo de trabajo tareas de programación

1
kj007 16 oct. 2018 a las 16:35

Hay algunos aspectos de su problema,

  1. Necesitas caducidad del token

  2. Debe verificar si el usuario ya ha utilizado el token.

Solución:

Puede usar Spring Rest JWT Authentication para generar token que vence. que expira automáticamente después del tiempo establecido, no es necesario almacenarlo en ningún lugar.

Ahora, como también debe verificar si TOKEN ya se ha utilizado, puede almacenar el token en la base de datos como un campo de ese OBJETO DE USUARIO. Por lo tanto, cada vez que se redirige al usuario al punto final de la aplicación desde el correo electrónico, JWT verificará automáticamente si TOKEN es válido y no ha expirado, y luego, como siguiente paso, también puede verificar si es el mismo token que guardó en db antes de permitir que el usuario reinicie su contraseña.

Como último paso, asegúrese de eliminar ese token de la base de datos una vez que el usuario restablezca correctamente la contraseña, ya que esto evitará que el mismo token se use nuevamente para el descanso de la contraseña dentro del plazo de vencimiento.

Puede jugar con esto, para personalizar la solución según los requisitos de la aplicación, por ejemplo, si desea que se notifique al usuario si alguien intentó restablecer la contraseña utilizando un token caducado o un token ya usado.

0
Aditya T 16 oct. 2018 a las 12:47