Как удалить определенные данные из таблицы базы данных с помощью весенней загрузки? - PullRequest
0 голосов
/ 16 октября 2018

Я создал страницу входа в систему, на которой я упомянул ссылку забытого пароля, которая перенаправляет пользователя на страницу, где он должен вставить адрес электронной почты, чтобы получить токен, сгенерированный из программы.С помощью этого токена пользователь перенаправляется на страницу смены пароля, где он / она может изменить свой пароль.

Теперь моя задача - установить время истечения срока действия для того токена, который хранится в базе данных, и долженудалить после этого конкретного времени.Как я могу сделать это с помощью Spring boot?

Этот контроллер генерирует и сохраняет токен в базе данных.

@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";
}

Этот контроллер перенаправляет страницу changePasswordпри нажатии на токен

@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;

}

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Включите планирование в своем основном весеннем загрузочном классе с помощью @EnableScheduling и запланируйте запуск задания для удаления из таблицы через некоторое время.

@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
     }
}

Подробнее о настройке задания см. Здесь EnableScheduling

См. Здесь руководство по рабочему примеру scheduling-tasks

0 голосов
/ 16 октября 2018

Есть несколько аспектов вашей проблемы,

  1. Вам нужно истечение токена

  2. Вам необходимо проверить, не был ли токен уже использованuser.

Решение:

Вы можете использовать Аутентификация JWT Spring Rest , чтобы сгенерировать токен с истекающим сроком действия, который автоматически истекает по истечении заданного времени, нет необходимости сохранятьэто где угодно.

Теперь, так как вам также необходимо проверить, был ли TOKEN уже использован, вы можете сохранить токен в базе данных как поле этого ПОЛЬЗОВАТЕЛЬСКОГО ОБЪЕКТА.Таким образом, каждый раз, когда пользователь перенаправляется обратно в конечную точку приложения из электронной почты, JWT автоматически проверяет, является ли TOKEN действительным и не истек ли он, и затем в качестве следующего шага вы также можете проверить, является ли тот же самый токен, который вы сохранили в db, прежде чем разрешить сброс пользователяих пароль.

В качестве последнего шага обязательно удалите этот токен из БД после того, как пользователь успешно сбросит пароль, поскольку это предотвратит повторное использование этого токена для восстановления пароля в течение срока действия.

Вы можете поработать над этим, чтобы настроить решение в соответствии с требованиями приложения, например, если вы хотите, чтобы пользователь был уведомлен, если кто-то попытался попытаться сбросить пароль, используя токен с истекшим сроком действия или уже использованный токен.

...