如何扩展 OAuth2 主体

Tar*_*haf 5 java spring-security spring-security-oauth2 jhipster

我们正在开发一个将 OAuth 2 用于两个用例的应用程序:

  1. 访问后端微服务(使用client_credentials
  2. 对应用程序的用户进行身份验证(使用authorization_code,因此将用户重定向到 Keycloak 进行登录,大致配置如教程中所示)。

在对用户进行身份验证时,我们从身份验证服务器接收部分信息(例如登录信息),另一部分可以在本地用户表中找到。我们想要做的是创建一个主体对象,其中还包含本地数据库中的数据。

PrimaryExtractor似乎是一条出路。由于我们必须使用手动 OAuth 配置才能不干扰 OAuth 用例 1,因此我们创建它并设置它:

tokenServices.setPrincipalExtractor(ourPrincipalExtractor);
Run Code Online (Sandbox Code Playgroud)

该实现基本上执行数据库查找并在映射函数中返回 CustomUser 对象。现在,虽然这似乎有效(调用提取器),但它没有正确地保留在会话中。因此,在我们的许多 REST 资源中,我们正在注入当前用户:

someRequestHandler(@AuthenticationPrincipal CustomUser activeUser) {
Run Code Online (Sandbox Code Playgroud)

并在那里接收 null 。查看注入的Authentication它表明它是一个OAuth2Authentication对象,具有默认的主体对象(我认为它是一个 Spring User/ UserDetails)。之所以为空,是因为它不是我们CustomUser之前返回的。

我们是否误解了工作方式PrincipalExtractor?这是否是我们的过滤器链配置错误,因为我们在同一个应用程序中有两种不同的 OAuth 机制(如前面提到的)?Spring 的主体存储库中的断点向我们展示了它CustomUser保存在那里,然后使用原始类型进行保存,这似乎覆盖了它。

Tar*_*haf 2

好吧,回答我自己的问题:

  1. PrincipalExtractor似乎是定制主体的常用和标准方法
  2. 它在我们的例子中不起作用,因为我们使用的是 JHipster 应用程序,它在登录后立即用它自己的User. 因此所有映射都PrincipalExtractor被重置。如果有人有同样的问题:看看UserService

我猜这就是使用您不详细了解的生成代码的缺点。