Я пытаюсь понять вариант использования @AuthenticationPrincipal.
В моем контроллере у меня есть метод, который я использую в качестве параметра
@AuthenticationPrincipal User user
Цель состоит в том, чтобы получить пользователя из jwt, поэтому я создал класс преобразователя, который реализует HandlerMethodArgumentResolver. Для supportParameters это мой класс User, а мойsolveArgument получает jwt из webRequest, декодирует его и создает объект User, этот объект возвращается (и используется в моем методе контроллера).
Я попытался удалить @AuthenticationPrincipal, потому что я не использую Principal в своем классе, который реализует HandlerMethodArgumentResolver, он работает отлично, но, согласно моим исследованиям, «очень рекомендуется» использовать эту аннотацию, даже если она работает без нее.
Кто-нибудь знает, почему и как именно в этом случае нужно/не обязательно использовать @AuthenticationPrincipal, это поможет мне лучше понять это?
Спасибо




Почему вам нужно реализовать HandlerMethodArgumentResolver, чтобы решить @AuthenticationPrincipal? Spring Security уже поставляется с реализацией под названием AuthenticationPrincipalArgumentResolver для таких вещей и будет включена по умолчанию.
Пока вы настраиваете Authentication так, чтобы он содержал ваш пользовательский объект, и сохраняете его в SecurityContext после того, как Spring Security успешно аутентифицирует пользователя, он должен работать «из коробки».
Единственная ситуация, в которой вам нужно реализовать HandlerMethodArgumentResolver, — это если вы не используете Spring Security, но хотите указать пользовательский объект для текущего пользователя в качестве аргумента в методе контроллера. Если это так, вам не нужно аннотировать @AuthenticationPrincipal в аргументе контроллера, поскольку ваша реализация не имеет к этому никакого отношения.
хорошо, тогда правильно настройте безопасность Spring так, чтобы Authentication правильно содержал ваш объект использования, а затем просто используйте @AuthenticationPrincipal в методе контроллера. нет необходимости реализовывать свой собственный HandlerMethodArgumentResolver
Это верно. Когда я проверяю свой JWT, если он действителен, я устанавливаю свой объект аутентификации в своем SecurityContextHolder с информацией, предоставленной в JWT (в данном случае, пользователем). Наконец, мне просто нужно сравнить пользователя в Аутентификации (установленной с помощью фильтра) с идентификатором пользователя запроса. Спасибо.
хорошо. тогда ты считаешь, что мой ответ полезен для тебя? если да, не могли бы вы проголосовать за него или принять его, поскольку я трачу много времени, чтобы помочь вам бесплатно. ваше здоровье.
Я использую Spring Security и вхожу в систему с помощью токенов JWT. Я хочу запретить некоторым пользователям доступ к путям, которые им запрещены. Например, если пользователь с идентификатором 17 обращается к .../data?userId=33, ему не должно быть разрешено это делать. В этом случае мне нужно сравнить идентификатор пользователя из JWT с идентификатором пользователя в запросе и посмотреть, есть ли совпадение.