Сообщение об ошибке при смене пароля
В веб-программе есть страница со сменой пароля (вводишь текущий пароль, дважды вводишь новый пароль, если текущий пароль верен и новые пароли соответствуют друг другу, то изменение запиывается в БД). Хочу добавить в форму сообщение об ошибке, если нов.пароли не равны или текущий пароль введен с ошибкой. Как вариант, предполагаю, что можно сохранить три формы ввода паролей (первая - первичный ввод, вторая - первая форма с добавлением lable "не верно указан текущий пароль", третья - первая форма с добавлением lable "новые пароли не равны") и в контролере, взависимости от ситуации, выводить нужную из них. Но может быть у кого-нибудь есть понимание как в данном случае проводить валидацию встроеными средствами?
HTML код
<div class="container">
<h1>Сменить пароль</h1>
<form method="POST" th:action="@{/password/change}" >
<label> Пароль: </label>
<input type="password" name="current_password" id="current_password" class="form-control col-4 mb-4"/><br/>
<label> Новый пароль: </label>
<input type="password" name="new_password" id="new_password" class="form-control col-4 mb-4"/><br/>
<label> Повторите новый пароль: </label>
<input type="password" name="new_password_2" id="new_password_2" class="form-control col-4 mb-4"/><br/>
<input type="submit" value="Изменить" class="btn btn-primary col-2"/>
</form>
</div>
Контролер:
@RequestMapping("/change")
public String updatePassword(@RequestParam("current_password") String currentPassword,
@RequestParam("new_password") String newPassword,
@RequestParam("new_password_2") String newPassword2,Model model) {
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (securityConfig.passwordEncoder().matches(currentPassword,user.getPassword())) {
if (newPassword.equals(newPassword2)){
user.setPassword(securityConfig.passwordEncoder().encode(newPassword));
userRepository.save(user);
return "/info/change_password_successfully";
}
}
return "redirect:/password";
}
Ответы (1 шт):
Вопрос решился путем добавления в форму трех пустых label, а в контролере, в зависимости от ситуации, присватваю им значение
Контролер
private String messageCurrentPsw;
private String messageNewPsw;
private String messageSuccess;
@RequestMapping("/change")
public String updatePassword(@RequestParam("current_password") String currentPassword,
@RequestParam("new_password") String newPassword,
@RequestParam("new_password_2") String newPassword2,Model model) {
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (!securityConfig.passwordEncoder().matches(currentPassword,user.getPassword())) {
this.messageCurrentPsw="Пароль указан неверно";
this.messageNewPsw="";
this.messageSuccess="";
return "redirect:/password";
}
if (!newPassword.equals(newPassword2)){
this.messageCurrentPsw="";
this.messageNewPsw="Пароли не совпадают";
this.messageSuccess="";
return "redirect:/password";
}
if (securityConfig.passwordEncoder().matches(currentPassword,user.getPassword())) {
this.messageCurrentPsw = "";
this.messageNewPsw="";
this.messageSuccess="Пароль успешно изменен!";
user.setPassword(securityConfig.passwordEncoder().encode(newPassword));
userRepository.save(user);
return "redirect:/password";
}
return "redirect:/password";
}
Html форма
<form method="POST" th:action="@{/password/change}" >
<label> Пароль: </label>
<span class = "error" > [[${messageCurrentPsw}]]</span>
<input type="password" name="current_password" id="current_password" class="form-control col-4 mb-4"/><br/>
<label> Новый пароль: </label>
<span class = "error" > [[${messageNewPsw}]]</span>
<input type="password" name="new_password" id="new_password" class="form-control col-4 mb-4"/><br/>
<label> Повторите новый пароль: </label>
<span class = "error" > [[${messageNewPsw}]]</span>
<input type="password" name="new_password_2" id="new_password_2" class="form-control col-4 mb-4"/><br/>
<input type="submit" value="Изменить" class="btn btn-primary col-2"/>
</form>