我们正在开发一个将 OAuth 2 用于两个用例的应用程序:
- 访问后端微服务(使用
client_credentials
)
- 验证应用程序的用户(使用
authorization_code
,因此将用户重定向到 Keycloak 进行登录,大致配置如下所示tutorial https://spring.io/guides/tutorials/spring-boot-oauth2/#_social_login_manual).
在对用户进行身份验证时,我们从身份验证服务器接收部分信息(例如登录信息),另一部分可以在本地用户表中找到。我们想要做的是创建一个主体对象,其中还包含本地数据库中的数据。
主要提取器 https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/security/oauth2/resource/PrincipalExtractor.html似乎是要走的路 http://mmkay.pl/2017/03/19/spring-boot-saving-oauth2-login-data-in-db-using-principalextractor/。由于我们必须使用手动 OAuth 配置才能不干扰 OAuth 用例 1,因此我们创建它并设置它:
tokenServices.setPrincipalExtractor(ourPrincipalExtractor);
该实现基本上执行数据库查找并在映射函数中返回 CustomUser 对象。现在,虽然这似乎有效(调用提取器),但它没有正确地保留在会话中。因此,在我们的许多 REST 资源中,我们正在注入当前用户:
someRequestHandler(@AuthenticationPrincipal CustomUser activeUser) {
并在那里接收 null 。正在研究注射的Authentication
它表明它是一个OAuth2身份验证 https://docs.spring.io/spring-security/oauth/apidocs/org/springframework/security/oauth2/provider/OAuth2Authentication.html对象与默认的主体对象(我认为它是一个SpringUser
/ UserDetails
)。如此 null 因为它不是我们的CustomUser
之前回来过。
我们是否误解了方法PrincipalExtractor
作品?这是否是我们的过滤器链配置错误,因为我们在同一个应用程序中有两种不同的 OAuth 机制(如前面提到的)? Spring 的主要存储库中的断点向我们表明CustomUser
保存在那里,然后使用原始类型保存,这似乎会覆盖它。
好吧,回答我自己的问题:
-
PrincipalExtractor
似乎是定制主体的常用和标准方法
- 它在我们的例子中不起作用,因为我们使用的是 JHipster 应用程序,它在登录后立即用它自己的应用程序覆盖主体
User
。所以所有映射都在PrincipalExtractor
已重置。如果有人有同样的问题:看看UserService
.
我猜这就是使用您不详细了解的生成代码的缺点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)