Spring Security登録-確認メールの再送信
1. 概要
このチュートリアルでは、進行中のRegistration with Spring Security seriesを継続し、ユーザーがアカウントをアクティブ化する前に有効期限が切れた場合に、確認リンクをユーザーに再送信することを検討します。
2. 検証リンクを再送する
まず、前のユーザーが期限切れになった場合に、ユーザーrequests another verification linkがどうなるかを見てみましょう。
まず、既存のトークンを新しいexpireDateでリセットします。 、新しいリンク/トークンを含む新しいメールをユーザーに送信します。
@RequestMapping(value = "/user/resendRegistrationToken", method = RequestMethod.GET)
@ResponseBody
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;
}
また、モデルabout the expiration of the tokenにいくつかの新しい情報を追加することにより、既存の登録機能を変更する必要があります。
@RequestMapping(value = "/regitrationConfirm", method = RequestMethod.GET)
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. 例外ハンドラー
以前の機能は、特定の条件下で–例外をスローします。これらの例外を処理する必要があり、a custom exception handlerを使用して処理します。
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@Autowired
private MessageSource messages;
@ExceptionHandler({ UserNotFoundException.class })
public ResponseEntity
ご了承ください:
-
アプリケーション全体で例外を処理するために@ControllerAdviceアノテーションを使用しました
-
単純なオブジェクトGenericResponseを使用して応答を送信しました。
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を変更する
トークンの有効期限が切れた場合にのみユーザーが新しいVerificationTokenを取得できるようにすることで、badUser.htmlを変更します。
bad user
error
signup
resend
ここでは、非常に基本的なjavascriptとJQueryを使用して、「/ user / resendRegistrationToken」の応答を処理し、それに基づいてユーザーをリダイレクトしていることに注意してください。
5. 結論
この簡単な記事では、古いものが期限切れになった場合に備えて、ユーザーにrequest a new verification link to activate their accountを許可しました。
このチュートリアルのfull implementationは、the github projectにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。