使用 @AuthenticationPrincipal 注入自定义 OidcUser 包装器

Posted

技术标签:

【中文标题】使用 @AuthenticationPrincipal 注入自定义 OidcUser 包装器【英文标题】:Inject custom OidcUser wrapper with @AuthenticationPrincipal 【发布时间】:2020-06-18 12:53:45 【问题描述】:

我正在使用带有 Okta 的 springboot 安全性进行身份验证。我目前正在尝试创建一个实现 OidcUser 的抽象类来封装一些方法。例如:

public abstract class OktaUser implements OidcUser 

    public UUID getUserId() 
        return UUID.fromString(Objects.requireNonNull(this.getAttribute("user_id")));
    

我通常注入 OidcUser (Working)

@GetMapping
public User currentUser(@AuthenticationPrincipal OidcUser oidcUser) 
    UUID id = UUID.fromString(Objects.requireNonNull(oidcUser.getAttribute("user_id")));

    return userService.getUser(id);

但我想这样做(不工作)

@GetMapping
public User currentUser(@AuthenticationPrincipal OktaUser oktaUser) 
    return userService.getUser(oktaUser.getMicaUserId());

但是,oktaUser 始终为空。有没有办法将OktaUser注册为AuthenticationPrincipal

【问题讨论】:

【参考方案1】:

看看 Spring Security 指南: https://docs.spring.io/spring-security/site/docs/5.2.0.RELEASE/reference/htmlsingle/#mvc-authentication-principal

它正是通过这一点。您甚至可以定义您的注释,例如 @MicaUser,这将解决您的自定义实现。

【讨论】:

即使通过指南,我也无法注入我的自定义类型。我用***.com/questions/17741787/… 解决了我的问题。也许是因为 OidsUser?【参考方案2】:

我终于从这个post找到了解决办法

使用 ControllerAdvice,我能够构建并返回我的自定义 OidcUser。

@ModelAttribute
public OktaUser oktaUser(@AuthenticationPrincipal OidcUser oidcUser) 
    return oidcUser == null
        ? null
        : new OktaUser(oidcUser.getAuthorities(), oidcUser.getIdToken(), oidcUser.getUserInfo());

我可以这样注入它

@GetMapping
public void getAll(@ModelAttribute OktaUser oktaUser) 


【讨论】:

以上是关于使用 @AuthenticationPrincipal 注入自定义 OidcUser 包装器的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)