如何使用Spring Boot从数据库表中删除特定数据?

时间:2018-10-16 12:28:40

标签: spring spring-mvc spring-boot spring-security spring-data-jpa

我创建了一个登录页面,上面提到了“忘记密码”链接,该链接将用户重定向到必须插入电子邮件地址才能接收程序生成的令牌的页面。在此令牌的帮助下,用户被重定向到“更改密码”页面,在该页面上他/她可以更改其密码。

现在,我担心的是将过期时间设置为存储在数据库中的令牌,并且应该在该特定时间之后将其删除。 如何使用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 :(得分:1)

通过使用@EnableScheduling在主spring引导类上启用调度,并安排要运行的作业一段时间后从表中删除。

@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

答案 1 :(得分:0)

您遇到的问题很少,

  1. 您需要令牌到期

  2. 您需要检查用户是否已使用令牌。

解决方案:

您可以使用Spring Rest JWT Authentication生成过期令牌,该令牌会在设置的时间后自动过期,而无需将其存储在任何地方。

现在,由于还需要检查是否已使用令牌,因此可以将令牌作为该用户对象的字段存储在数据库中。 因此,每次用户从电子邮件重定向回应用程序端点时,JWT都会自动检查TOKEN是否有效且尚未过期,然后作为下一步,您还可以检查其令牌是否与您在db中保存的令牌相同,然后再让用户重置他们的密码。

最后一步,请确保一旦用户成功重置密码,便从数据库中删除该令牌,因为这将防止在到期时间范围内再次将同一令牌用于保留密码。

您可以对此进行修改,以根据应用程序要求自定义解决方案,例如,如果您希望在有人尝试使用过期令牌或已使用令牌重设密码的情况下通知用户,请。