使用 @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有三种方式(不使用,动态使用,静态使用,默认是动态使用)