Куда вынести getCurrentUser? Вот пишу свой первый проект в SpringBoot дабы набить руку. И вот при создании UserService я заметил что у меня есть функция getCurrentUser которой пользуются другие сервисы (для проверки прав, владения и т.д.) а также getCurrentUserResponse (возвращает уже в виде Response, дабы контроллер вывел ответ) И тут как раз возник вопросик, не стоит ли вынести getCurrentUser куда-то в другое место? может утилиту? но я слышал что утилитам лучше не брать самостоятельно данные из репозитория, или может вовсе в AuthService? (у меня там логика регистрации и авторизации пользователя которая опять же возвращается в UserService для создания пользователя).

2 Июн в 19:53
309 +1
0
Ответы
1

Это хорошая практика — стремиться к четкой организации кода и разделению ответственности в вашем проекте на Spring Boot. Исходя из вашего описания, есть несколько возможных подходов к внедрению метода getCurrentUser.

1. Вынесение в отдельный класс (например, UserContext или CurrentUserProvider)

Если getCurrentUser используется в нескольких сервисах, вы можете создать отдельный класс, который будет отвечать за получение текущего пользователя. Это позволит избежать дублирования и упростит тестирование. Например:

@Component
public class UserContext {
@Autowired
private SecurityContextHolder securityContextHolder;
public User getCurrentUser() {
Authentication authentication = securityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
return (User) authentication.getPrincipal();
}
throw new UserNotFoundException("User not found");
}
public UserResponse getCurrentUserResponse() {
User currentUser = getCurrentUser();
return UserResponse.fromUser(currentUser);
}
}

Затем вы сможете использовать этот класс в других сервисах, инжектируя его:

@Service
public class UserService {
@Autowired
private UserContext userContext;
public void someMethod() {
User currentUser = userContext.getCurrentUser();
// ваша бизнес-логика
}
}2. Внутри AuthService

Если метод getCurrentUser логически относится к процессу аутентификации и авторизации, вы можете рассмотреть вариант добавления его в AuthService. Однако, если логика вашего проекта подразумевает, что текущий пользователь может потребоваться и в других модулях, то лучше держать её в отдельном контексте.

3. В UserService

Если UserService является основным местом, где вы работаете с пользователями, и getCurrentUser() часто будет использоваться в контексте работы с пользователями, логично оставить его внутри этого сервиса. Однако это может привести к утечке ответственности, если в будущем другие сервисы начнут использовать его.

Рекомендация

В идеале, учитывая, что получение текущего пользователя может быть необходимо в различных службах, лучше выделить функциональность получения текущего пользователя в отдельный класс (например, UserContext). Это упростит повторное использование кода и сделает ваш код более чистым и поддерживаемым.

Такое разделение позволит вам изолировать логику доступа к текущему пользователю и упростить тестирование, а также придерживаться принципов SOLID, которые яснее разделяют ответственность в коде.

2 Июн в 19:53
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир