Итак, у меня есть приложение весенней загрузки, где я могу зарегистрироваться, войти в систему и пр. c. Я хочу сделать функцию "забыл пароль". Моя пользовательская модель содержит пароль с аннотацией (@NotBlank, @Size (min = 8)). Когда я регистрирую, эти аннотации работают нормально, и я не могу зарегистрироваться, если я оставляю поля ввода пароля пустыми или слишком короткими, я хочу, чтобы эти аннотации работали и при моем методе «изменения пароля».
public class User {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private Long id;
@NotBlank(message = "{registration.usernameNotBlank}")
@Size(min = 3, max = 32, message = "{registration.usernameSize}")
private String username;
@NotBlank(message = "{registration.passwordNotBlank}")
@Size(min = 8, message = "{registration.passwordSize}")
private String password;
}
В следующем фрагменте кода я проверяю, является ли токен подтверждения, полученный пользователем по электронной почте, действительным и существует, в случае, если я добавлю объект User в свой тимелист, чтобы он мог удерживаться на странице, где я запрашиваю новый пароль:
@GetMapping(PATH_CONFIRM_RESET)
public String formForNewPasswordPage(RedirectAttributes redirectAttributes,
@RequestParam(name = "token", required = true) String confirmationToken) {
if (userService.getConfirmationToken(confirmationToken) != null) {
User user = userService.getUserByConfirmationToken(confirmationToken);
redirectAttributes.addFlashAttribute("user", user);
return "redirect:/user/set-new-password";
}
return "redirect:/something-went-wrong";
}
Работает нормально, добавляет к модели flashAttribute и использует следующий метод:
@GetMapping(PATH_SET_NEW_PASSWORD)
public String changePasswordForm(@ModelAttribute("user") User user) {
System.out.println(user.toString());
return "relatedToUserAccounts/change-password";
}
На консоли:
User [id=4, username=testuser, password=$2a$10$j.ZnbCtk.S.2LOUjXjrvh.NPWCvVzYaFQeMM.SQxZDnktI2.N5UCK, matchingPassword=null, email=testuser@gmail.com]
Здесь он получает Пользовательский объект хорошо, "System.out.println (user.toString ());" показывает, что объект имеет все данные. Он открывает следующий html файл:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<section class="form">
<form th:action="@{/user/set-new-password}" method="post" th:object="${user}">
<label th:text="#{changePassword.newPassword}">New password</label><br/>
<input type="password" name="password" placeholder="Password" th:placeholder="#{password}" th:field="*{password}" autofocus/><br/>
<input type="password" name="matchesPassword" placeholder="Password" th:placeholder="#{password}" th:field="*{matchingPassword}" /><br/>
<input type="submit" class="submit-button" th:value="#{changePassword.submitButton}"/>
</form>
</section>
</body>
И вызывается следующий метод, если пользователь нажал кнопку отправки на этом html:
@PostMapping(PATH_SET_NEW_PASSWORD)
public String changePasswordOfUserAccount(@ModelAttribute("user") User user, BindingResult result) {
loggerInfoIsCalled(PATH_SET_NEW_PASSWORD, request);
System.out.println(user.toString());
return "redirect:/user/login";
}
На консоли:
User [id=null, username=null, password=testuser, matchingPassword=testuser, email=null]
Проблема возникает здесь: объект User больше не имеет правильных полей «username» и «email». И то, и другое имеет значение «null», в то время как у него есть новый пароль и новый совпадающий пароль.
Например: «changePasswordForm (@ModelAttribute (« user ») User user)» System.out.println () поместил это в мой консоль:
User [id=4, username=testuser, password=$2a$10$j.ZnbCtk.S.2LOUjXjrvh.NPWCvVzYaFQeMM.SQxZDnktI2.N5UCK, matchingPassword=null, email=testuser@gmail.com]
Я получил страницу HTML, где я могу дать новый пароль, нажать на кнопку, и объект User теперь выглядит так:
User [id=null, username=null, password=testuser, matchingPassword=testuser, email=null]
id, username, email стал пустым.
Я бы предпочел не создавать метод, который проверяет все ограничения, которые я ввел в модель User (вызовите метод для новых паролей, чтобы убедиться, что он не пустой или не слишком короткий ...)