Рубрики
Без рубрики

Весенняя регистрация безопасности – Электронная почта проверки Resend

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

Автор оригинала: Eugen Paraschiv.

1. Обзор

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

2. Повторное подтверждение ссылки

Во-первых, давайте посмотрим, что происходит, когда пользователь запрашивает другую ссылку проверки , в случае, если предыдущий истек.

Во-первых – мы сбросим существующий токен с новым срок действия . Мы отправим пользователю новое письмо с новой ссылкой/токеном:

@GetMapping("/user/resendRegistrationToken")
public GenericResponse resendRegistrationToken(
  HttpServletRequest request, @RequestParam("token") String existingToken) {
    VerificationToken newToken = userService.generateNewVerificationToken(existingToken);
    
    User user = userService.getUser(newToken.getToken());
    String appUrl = 
      "http://" + request.getServerName() + 
      ":" + request.getServerPort() + 
      request.getContextPath();
    SimpleMailMessage email = 
      constructResendVerificationTokenEmail(appUrl, request.getLocale(), newToken, user);
    mailSender.send(email);

    return new GenericResponse(
      messages.getMessage("message.resendToken", null, request.getLocale()));
}

И утилита для фактического создания сообщения электронной почты пользователь получает – constructResendVerificationTokenEmail() :

private SimpleMailMessage constructResendVerificationTokenEmail
  (String contextPath, Locale locale, VerificationToken newToken, User user) {
    String confirmationUrl = 
      contextPath + "/regitrationConfirm.html?token=" + newToken.getToken();
    String message = messages.getMessage("message.resendToken", null, locale);
    SimpleMailMessage email = new SimpleMailMessage();
    email.setSubject("Resend Registration Token");
    email.setText(message + " rn" + confirmationUrl);
    email.setFrom(env.getProperty("support.email"));
    email.setTo(user.getEmail());
    return email;
}

Нам также необходимо изменить существующую функциональность регистрации, добавив некоторую новую информацию о модели об истечении срока действия токена :

@GetMapping("/registrationConfirm")
public String confirmRegistration(
  Locale locale, Model model, @RequestParam("token") String token) {
    VerificationToken verificationToken = userService.getVerificationToken(token);
    if (verificationToken == null) {
        String message = messages.getMessage("auth.message.invalidToken", null, locale);
        model.addAttribute("message", message);
        return "redirect:/badUser.html?lang=" + locale.getLanguage();
    }

    User user = verificationToken.getUser();
    Calendar cal = Calendar.getInstance();
    if ((verificationToken.getExpiryDate().getTime() - cal.getTime().getTime()) <= 0) {
        model.addAttribute("message", messages.getMessage("auth.message.expired", null, locale));
        model.addAttribute("expired", true);
        model.addAttribute("token", token);
        return "redirect:/badUser.html?lang=" + locale.getLanguage();
    }

    user.setEnabled(true);
    userService.saveRegisteredUser(user);
    model.addAttribute("message", messages.getMessage("message.accountVerified", null, locale));
    return "redirect:/login.html?lang=" + locale.getLanguage();
}

3. Обработчик исключений

Предыдущая функциональность, при определенных условиях – бросали исключения; эти исключения должны быть обработаны, и мы собираемся сделать это с пользовательский обработчик исключений :

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @Autowired
    private MessageSource messages;

    @ExceptionHandler({ UserNotFoundException.class })
    public ResponseEntity handleUserNotFound(RuntimeException ex, WebRequest request) {
        logger.error("404 Status Code", ex);
        GenericResponse bodyOfResponse = new GenericResponse(
          messages.getMessage("message.userNotFound", null, request.getLocale()), "UserNotFound");
        
        return handleExceptionInternal(
          ex, bodyOfResponse, new HttpHeaders(), HttpStatus.NOT_FOUND, request);
    }

    @ExceptionHandler({ MailAuthenticationException.class })
    public ResponseEntity handleMail(RuntimeException ex, WebRequest request) {
        logger.error("500 Status Code", ex);
        GenericResponse bodyOfResponse = new GenericResponse(
          messages.getMessage(
            "message.email.config.error", null, request.getLocale()), "MailError");
        
        return handleExceptionInternal(
          ex, bodyOfResponse, new HttpHeaders(), HttpStatus.NOT_FOUND, request);
    }

    @ExceptionHandler({ Exception.class })
    public ResponseEntity handleInternal(RuntimeException ex, WebRequest request) {
        logger.error("500 Status Code", ex);
        GenericResponse bodyOfResponse = new GenericResponse(
          messages.getMessage(
            "message.error", null, request.getLocale()), "InternalError");
        
        return handleExceptionInternal(
          ex, bodyOfResponse, new HttpHeaders(), HttpStatus.NOT_FOUND, request);
    }
}

Обратите внимание, что:

  • мы использовали @ControllerAdvice аннотация для обработки исключений по всему приложению
  • мы использовали простой объект ОбщиеОтветы для отправки ответа:
public class GenericResponse {
    private String message;
    private String error;

    public GenericResponse(String message) {
        super();
        this.message = message;
    }

    public GenericResponse(String message, String error) {
        super();
        this.message = message;
        this.error = error;
    }
}

4. Изменить badUser.html

Теперь мы изменим badUser.html позволяя пользователю получить новую ПроверкаТокен только в том случае, если срок действия их токена истек:



bad user


error


signup

resend

Обратите внимание, что мы использовали некоторые очень основные JavaScript и J’query здесь для обработки ответа “/пользователя/resendRegistrationToken” и перенаправить пользователя на его основе.

5. Заключение

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

полная реализация этого учебника можно найти в проект github – это проект на основе Eclipse, поэтому он должен быть легким для импорта и запуска, как она есть.