@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 包装器

使用 EnableWebSecurity 时 AuthenticationPrincipal 为空

AuthenticationPrincipal 返回空的 UserDetails 对象