我正在尝试理解 @AuthenticationPrincipal 的用例。
在我的控制器中,我有一个用作参数的方法
@AuthenticationPrincipal User user
目标是从 jwt 获取用户,因此我创建了一个实现 HandlerMethodArgumentResolver 的解析器类。对于supportsParameters,它是我的User类,我的resolveArgument从webRequest获取jwt,对其进行解码并创建一个User对象,返回这个对象(并在我的控制器方法中使用)。
我尝试删除@AuthenticationPrincipal,因为我没有在实现HandlerMethodArgumentResolver的类中使用Principal,它工作得很好,但根据我的研究,“非常建议”使用这个注释,即使它没有。
有人知道为什么以及在这种情况下到底有没有必要使用@AuthenticationPrincipal,这将帮助我更好地理解它?
谢谢你
为什么需要实施
HandlerMethodArgumentResolver
来解决@AuthenticationPrincipal
? Spring Security 已经附带了一个名为 AuthenticationPrincipalArgumentResolver
的实现来执行此类操作,并将默认启用。
只要您自定义
Authentication
以包含您的用户对象,并在 Spring Security 成功验证用户身份后将其存储到 SecurityContext
,它应该可以开箱即用。
您需要实现
HandlerMethodArgumentResolver
的唯一情况是您不使用spring security,但想要为当前用户指定一个用户对象作为控制器方法中的参数。如果是这种情况,您不需要在控制器的参数中注释 @AuthenticationPrincipal
,因为您的实现与它无关。