Интерфейс @AuthenticationPrincipal и HandlerMethodArgumentResolver

Я пытаюсь понять вариант использования @AuthenticationPrincipal.

В моем контроллере у меня есть метод, который я использую в качестве параметра

@AuthenticationPrincipal User user

Цель состоит в том, чтобы получить пользователя из jwt, поэтому я создал класс преобразователя, который реализует HandlerMethodArgumentResolver. Для supportParameters это мой класс User, а мойsolveArgument получает jwt из webRequest, декодирует его и создает объект User, этот объект возвращается (и используется в моем методе контроллера).

Я попытался удалить @AuthenticationPrincipal, потому что я не использую Principal в своем классе, который реализует HandlerMethodArgumentResolver, он работает отлично, но, согласно моим исследованиям, «очень рекомендуется» использовать эту аннотацию, даже если она работает без нее.

Кто-нибудь знает, почему и как именно в этом случае нужно/не обязательно использовать @AuthenticationPrincipal, это поможет мне лучше понять это?

Спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Почему вам нужно реализовать HandlerMethodArgumentResolver, чтобы решить @AuthenticationPrincipal? Spring Security уже поставляется с реализацией под названием AuthenticationPrincipalArgumentResolver для таких вещей и будет включена по умолчанию.

Пока вы настраиваете Authentication так, чтобы он содержал ваш пользовательский объект, и сохраняете его в SecurityContext после того, как Spring Security успешно аутентифицирует пользователя, он должен работать «из коробки».

Единственная ситуация, в которой вам нужно реализовать HandlerMethodArgumentResolver, — это если вы не используете Spring Security, но хотите указать пользовательский объект для текущего пользователя в качестве аргумента в методе контроллера. Если это так, вам не нужно аннотировать @AuthenticationPrincipal в аргументе контроллера, поскольку ваша реализация не имеет к этому никакого отношения.

Я использую Spring Security и вхожу в систему с помощью токенов JWT. Я хочу запретить некоторым пользователям доступ к путям, которые им запрещены. Например, если пользователь с идентификатором 17 обращается к .../data?userId=33, ему не должно быть разрешено это делать. В этом случае мне нужно сравнить идентификатор пользователя из JWT с идентификатором пользователя в запросе и посмотреть, есть ли совпадение.

Anthony26 02.10.2023 10:02

хорошо, тогда правильно настройте безопасность Spring так, чтобы Authentication правильно содержал ваш объект использования, а затем просто используйте @AuthenticationPrincipal в методе контроллера. нет необходимости реализовывать свой собственный HandlerMethodArgumentResolver

Ken Chan 02.10.2023 10:23

Это верно. Когда я проверяю свой JWT, если он действителен, я устанавливаю свой объект аутентификации в своем SecurityContextHolder с информацией, предоставленной в JWT (в данном случае, пользователем). Наконец, мне просто нужно сравнить пользователя в Аутентификации (установленной с помощью фильтра) с идентификатором пользователя запроса. Спасибо.

Anthony26 02.10.2023 10:50

хорошо. тогда ты считаешь, что мой ответ полезен для тебя? если да, не могли бы вы проголосовать за него или принять его, поскольку я трачу много времени, чтобы помочь вам бесплатно. ваше здоровье.

Ken Chan 02.10.2023 11:48

Другие вопросы по теме