Упрощаем доступ к UserDetails активного пользователя в Spring

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вы хотите извлечь аутентифицированные данные о пользователе из контекста Spring Security, используйте следующий код:

Java
Скопировать код
UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

Таким образом, вы сможете моментально получить информацию о пользователе после его аутентификации.

Кинга Идем в IT: пошаговый план для смены профессии

Изучаем UserDetails: важные методы

Давайте подробнее разберём, как Spring Security предоставляет доступ к данным аутентифицированного пользователя.

Знакомство с @AuthenticationPrincipal

С версии Spring Security 3.2 вам доступна аннотация @AuthenticationPrincipal. Её использование позволит вам внедрять данные UserDetails непосредственно в аргументы методов контроллера.

Java
Скопировать код
public String controllerMethod(@AuthenticationPrincipal UserDetails currentUser) {
  // получаем currentUser для использования
  ...
}

Начиная с версии Spring 4.0 и более поздних, фреймворк самостоятельно обрабатывает эту аннотацию с помощью AuthenticationPrincipalArgumentResolver.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Создание собственного сервиса UserDetails: работа на высшем уровне

Вы можете определить сервис CustomUserDetails, который расширяет UserDetails. Это позволит вам более эффективно управлять информацией о пользователях — это будет похоже на собственное ателье для пользовательского интерфейса вашего приложения.

Независимость через интерфейс

Для того чтобы сделать ваш код независимым от Spring Security, создайте интерфейс для доступа к контексту безопасности. Такой подход упростит тестирование и существенно облегчит процесс мокирования.

Введение в @ActiveUser

Создайте аннотацию @ActiveUser и настройте HandlerMethodArgumentResolver для ее обработки. Для этого потребуется внести изменения в настройки Spring, но это позволит вам добиться большей гибкости.

Использование интерсептора для подробной информации

Реализация UserInterceptor, наследующего HandlerInterceptor, позволит применять операции до и после обработки запросов, а также внедрять UserDetails в контроллер перед выполнением действий.

Подходы для старых версий Spring

Если вы работаете со старыми версиями Spring Security, то можете использовать WebArgumentResolver для извлечения данных пользователя, обеспечивая при этом совместимость со старым кодом.

Визуализация

Считайте, что поиск информации о текущем пользователе UserDetails можно сравнить с поиском конкретного контакта в телефонной книге:

Markdown
Скопировать код
Телефонная книга (📱): [User1, User2, User3, ActiveUser]

Вы делаете запрос, чтобы найти информацию об этом пользователе:

Java
Скопировать код
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
UserDetails userDetails = (UserDetails) auth.getPrincipal();
// userDetails — это данные искомого контакта

Это эквивалентно запросу:

Markdown
Скопировать код
Вы (🧑‍💻): "Привет, устройство, покажи информацию об ActiveUser"

Телефон (📱): [Детали ActiveUser]

Таким образом, вы эффективно и безопасно получаете информацию.

Другие подходы

Избегайте явного приведения типов

Явное приведение типов можно избежать, если напрямую внедрить UserDetails в контроллеры и методы. Этот подход удобен, но важно помнить, что UserDetails должен быть привязан к контексту Spring с самого начала.

UserDetails: не всегда дополнение

UserDetails не всегда включен в объект Authentication. Например, при использовании OAuth2 данные о пользователе могут содержаться в других сущностях.

UserDetails и разные виды аутентификации

В зависимости от используемого механизма аутентификации, метод HttpServletRequest.getUserPrincipal() может возвращать UserDetails в разных формах.

Постобработка с помощью UserInterceptor

Используя UserInterceptor, вы можете применить метод postHandle для добавления информации о UserDetails в ModelAndView. Таким образом, эти данные будут подготовлены для отображения в представлениях или для дальнейшей обработки.

Адаптация вашего кода для будущих версий Spring Security

Собираетесь переходить на новую версию? Нет причин для паники.

Если вы планируете переходить на Spring Security 4.0 или более поздние версии, вам потребуется обновить аннотации и настройки в соответствии с новой структурой пакетов. Несмотря на наличие изменений, у вас все получится, будьте уверены!

@AuthenticationPrincipal знает всё

Вы можете максимально использовать возможности @AuthenticationPrincipal. Для получения дополнительной информации о управлении эта аннотация в различных условиях обратитесь к Javadocs.

Чистый контроллер — чистый ум

Организуйте чистоту кода контроллера, используя пользовательский источник доступа к контексту безопасности. Это позволит вам отделить бизнес-логику от функционала безопасности.

Полезные материалы

  1. Официальная документация — здесь вы найдете официальную документацию Spring Security по теме аутентификации.
  2. Детали сервиса UserDetails — углубитесь в изучение сервиса UserDetails.
  3. Учебник по Spring Security от Baeldung — здесь разобраны все аспекты аутентификации в рамках Spring Security.
  4. JAX-RS и JSON – Stack Overflow — научитесь работать с JAX-RS и JSON, полезно не только для Spring Security.
  5. Spring Security: форма входа с использованием базы данных – Mkyong.com — настройте процесс входа в систему с использованием базы данных.
  6. Аутентификация и авторизация в Spring Security – DZone — углубитесь в изучение аутентификации и авторизации с Spring Security.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Как вы можете извлечь данные аутентифицированного пользователя в Spring?
1 / 5