@puppylen

Как в spring boot + spring security — реализовать форму смены данных пользователя?

Добрый день.
Разбираюсь со спрингом, делаю простое CRUD приложение. Сделал авторизацию и регистрацию, при регистрации проверяю пароль на количество символов и сложность.

Решил прикрутить Личный кабинет, где пользователь может сам поменять свою почту, имя и (если нужно, пароль).
с сменой пароля проблем нет, не могут понять как сделать смену почты и имени без пароля, ведь я должен заполнить поля пароля и подтверждение пароля, и если я просто меняю имя и почту - валидатор ругается что пароль не может быть пустым.

Класс пользователя:
public class User{
@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private int id;
	
	@Column(name = "username")
	@NotBlank(message = "не может быть пустым")
	@Size(min = 2, message = "длина имени должна быть от 2 до 50 символов")
	@Size(max = 50,message = "длина имени должна быть от 2 до 50 символов")
	private String username;
	
	@Column(name = "password")
	@NotBlank(message = "не может быть пустым")
	@PaswordCheckStrong(message = "длина пароля от 8 до 128 латинских символов, должен содержать спец символы #?!@$%^&*- и одну большую и маленькую букву")
	private String password;
	
	@Transient
	private String passwordConfirm;
	
	@Column(name = "email",unique = true)
	@Email(message = "формат email не верный")
	@NotBlank(message = "email не может быть пустым")
	private String email;

//def constructor + getter + setter
}


Аннтоация PasswordCheckStrong - просто проверяет по regex качество пароля.

При передаче в шаблон - получаю текущего пользователя из
model.addAttribute("currentUser", (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal());

в thymeleaf обращаюсь к полям через th:object="${currentUser}" и th:input="*{id}",th:input="*{username}" и так далее.

Сам не смог придумать ничего лучше чем, убарть th:object и в modell.addAtribute внести строки пользователя.
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal());
String username =  user.getUsername();
String email = user.getEmail();
model.addAttribute("username", username);
model.addAttribute("email", email);


в форме thymeleaf их поменять и вернуть так же обычными String и уже потом обработать и добавить в User.

Но выглядит не красиво, как такие задачи решаются правильно?
  • Вопрос задан
  • 815 просмотров
Решения вопроса 1
@puppylen Автор вопроса
Затупил, убрал валидацию в сигнатуре метода контроллера, и через временного пользователя поменял нужные мне поля:
public String saveUser(@ModelAttribute("currentUser") User user,Model model, Principal principal) {
		User tempUser = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
		tempUser.setEmail(user.getEmail());
		tempUser.setUsername(user.getUsername());
                userService.save(tempUser);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
18 мая 2024, в 22:58
3000 руб./за проект
18 мая 2024, в 21:07
5000 руб./за проект
18 мая 2024, в 20:58
5000 руб./за проект