@AuthenticationPrincipal 是如何工作的?
Posted
技术标签:
【中文标题】@AuthenticationPrincipal 是如何工作的?【英文标题】:@AuthenticationPrincipal how works? 【发布时间】:2017-04-30 10:31:03 【问题描述】:我不明白@AuthenticationPrincipal
是如何工作的?
据我了解,要激活此注释,我们必须将注释驱动添加到 dispatcher-servlet
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean
class="org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
但是@AutheticationPrincipal
获取有关登录用户的信息。
@RequestMapping
public String getCart(@AuthenticationPrincipal User activeUser)
Customer customer = customerService.getCustomerByUsername(activeUser.getUsername());
int cartId = customer.getCart().getCartId();
return "redirect:/customer/cart/" + cartId;
【问题讨论】:
【参考方案1】:Spring Security 将注册一个默认过滤器SecurityContextPersistenceFilter
。
SecurityContextPersistenceFilter
用于获取并将SecurityContext
设置为SecurityContextHolder
(这有一个实现SecurityContextHolderStrategy
的属性,如果你没有设置特殊模式,它是ThreadLocal
),它得到SecurityContext
来自Session
通常(或经过身份验证后,上下文将在其他过滤器中设置为SecurityContextHolder
),我们可以在通过此处理请求的线程中通过静态方法获取SecurityContext
方式:
SecurityContext context = SecurityContextHolder.getContext()
最后,一个请求完成后,SecurityContextPersistenceFilter
会从SecurityContextHolder
清除Context
,比如一些线程被重用,可能会导致一些问题。
【讨论】:
【参考方案2】:AuthenticationPrincipalArgumentResolver 负责使用@AuthenticationPrincipal
注解解析Authentication.getPrincipal()
。
你可以看到in the source code of AuthenticationPrincipalArgumentResolver的逻辑。
【讨论】:
以上是关于@AuthenticationPrincipal 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章
@AuthenticationPrincipal 是如何工作的?
@AuthenticationPrincipal 与 Spring Boot 不工作
@AuthenticationPrincipal 返回空用户
使用 @AuthenticationPrincipal 注入自定义 OidcUser 包装器