Пользователь - oyboy/Jora GitHub Wiki
Модель UserAvatar
представляет собой аватар пользователя. Она содержит информацию о двоичных данных изображения и идентификаторе пользователя, которому принадлежит аватар.
-
id: Long
- Уникальный идентификатор аватара (генерируется автоматически). -
bytes: byte[]
- Двоичные данные аватара пользователя. -
userId: Long
- Идентификатор пользователя, которому принадлежит аватар.
Модель User
представляет собой пользователя системы. Она отвечает за хранение информации о пользователе, такой как имя, пароль, электронная почта и статус активности.
-
id: Long
- Уникальный идентификатор пользователя (генерируется автоматически). -
username: String
- Имя пользователя (обязательное поле, максимум 50 символов). -
password: String
- Пароль пользователя (обязательное поле, минимум 4 символа, не отображается в строковом представлении). -
confirmPassword: String
- Подтверждение пароля (временное поле). -
email: String
- Электронная почта пользователя (обязательное поле, максимум 50 символов). -
active: boolean
- Статус активности пользователя (активен/неактивен). -
userProjectRoles: Set<UserProjectRole>
- Связь с ролями пользователей в проектах. -
userTasks: Set<UserTask>
- Связь с задачами, назначенными пользователю. -
tags: List<Tag>
- Список тегов, связанных с пользователем.
-
getAuthorities(): Collection<? extends GrantedAuthority>
- Возвращает коллекцию ролей, назначенных пользователю. -
isAccountNonExpired()
: Проверяет, не истек ли срок действия учетной записи. -
isAccountNonLocked()
: Проверяет, не заблокирована ли учетная запись. -
isCredentialsNonExpired()
: Проверяет, не истек ли срок действия учетных данных. -
isEnabled()
: Проверяет, активна ли учетная запись.
Контроллер UserController
предоставляет функциональность для отображения страницы редактирования пользователя, обновления данных профиля и управления аватаром.
-
currentUser
: Заполняет текущего пользователя, основанного на аутентификации. -
editUserPage
: Отображает страницу редактирования пользователя. -
editUser
: Обрабатывает запросы на редактирование профиля пользователя с проверкой ошибок и обновлением данных. -
uploadAvatar
: Обрабатывает загрузку аватара пользователя с проверкой формата файла и ошибок сохранения. -
deleteAvatar
: Удаляет аватар пользователя по его идентификатору.
REST-контроллер UserRestController
предоставляет API для получения аватара пользователя по идентификатору пользователя.
-
getAvatar
: Получает аватар пользователя по его идентификатору. Если аватар найден, возвращает его в формате JPEG, иначе возвращает статус 404 (не найден).
Сервис UserService
управляет логикой обработки данных пользователей. Он взаимодействует с репозиториями для выполнения операций создания, редактирования и удаления пользователей и их аватаров.
-
createUser(User user)
: Создает нового пользователя и сохраняет его в базе данных. -
editUser(Long user_id, User form)
: Обновляет данные пользователя, проверяя на наличие ошибок и существование других пользователей с той же электронной почтой. -
getUserById(Long user_id)
: Получает пользователя по его идентификатору. -
setAvatar(MultipartFile file, Long user_id)
: Сохраняет аватар пользователя с возможностью сжатия изображения. -
deleteAvatarForUser(Long user_id)
: Удаляет аватар пользователя по его идентификатору. -
findAvatarByUserId(Long user_id)
: Получает аватар пользователя или устанавливает аватар по умолчанию, если аватар не найден.
Для данных целей используется один контроллер (RegisterController) в связке с сервисом (UserService). В post-методе реализована множественная проверка входных данных:
//Совпадение паролей
/*Здесь вызывается метод rejectValue для объекта errors. Этот метод принимает три аргумента: "confirmPassword" указывает на имя поля, к которому относится ошибка. Это используется для связывания ошибки с конкретным полем формы. "error.user" — это код ошибки, который можно использовать для интернационализации или регистрации конкретного типа ошибки.*/
if (!user.getPassword().equals(user.getConfirmPassword())) {
errors.rejectValue("confirmPassword", "error.user", "Пароли не совпадают");
model.addAttribute("errors", errors);
return "registration";
}
boolean created = userService.createUser(user);
if (!created) {
model.addAttribute("errorMessage",
"Пользователь уже существует");
return "registration";
}
Ключевым полем, отличающее одну сущность от другой, является email. По этой причине необходимо было написать отдельный ModelAttribute, вместо того, чтобы вызывать обычный principal.getName(), который возвращает не то, что нужно.
@ModelAttribute(name = "user")
public User getUser(){
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.getPrincipal() instanceof User) {
return (User) authentication.getPrincipal();
}
return new User();
}
Этот метод добавлен в ProjectController, т.к. используется в связанных с ним шаблонах! Также в репозиторий был добавлен метод поиска сущности в бд по email: User findByEmail(String email);
.
UserDetailsService тоже нужно было переопределить, чтобы правильно отрабатывала авторизация
@Service
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {
private final UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String email)
throws UsernameNotFoundException {
User user = userRepository.findByEmail(email);
if (user != null) {
return user;
}
System.out.println("Oh net usera");
throw new UsernameNotFoundException(
"User '" + email + "' not found");
}
}