java—使用spring oauth2resttemplate时如何切换到服务用户

k5hmc34c  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(202)

我试图使用spring的oauth2resttemplate,但是我们需要它在进行rest调用时使用一些超级用户(我们定义了用户),而不是通过最初进行服务调用的用户。
情况是这样的: userA 打电话给 endpointA . 当然,他有权访问这个端点(基于他在keydrope中分配的角色中允许的操作)。 endpointA 然后将使用oauth2resttemplate对另一个服务进行rest调用, endpointB . 然而, userA 没有命中该终结点的权限。这个电话应该作为 service-user 在我们的钥匙斗篷里,他本质上是一个超级用户,可以做任何事情。问题是,oauth2resttemplate保留了发出原始调用的同一个用户( userA )-由于不允许他访问该端点,因此调用失败(基于我们设置的rbac内容,与oauth2安全方面分开)。
有没有一种方法可以使用 userA ,并使用 service-user 什么都有?注意:oauth2的信息 service-user 应该仍然像它仍然是一样被检索 userA (在keydrope中查找)。基本上,这只是我们在进行rest调用之前更改用户名(嗯。。。我想这就是它的含义)。
注意:我找到了一个方法暂时通过这个。也就是说,在进行rest调用之前创建一个新线程。这是因为spring不再能够访问该新线程中用户的安全上下文,从而强制它使用创建oauth2restemplate时提供的安全详细信息检索新令牌。这表明,另一种解决方案(实际上更可取)是强制oauth2resttemplate在命中时总是检索一个新令牌(使用resourcedetails,而不是用户令牌的“刷新”),而不是在请求开始时使用存储在securitycontextholder中的令牌。

ljsrvy3e

ljsrvy3e1#

最后,我只是清理了背景,然后打了剩下的电话:

SecurityContextHolder.clearContext()

当oauth2resttemplate进行调用时,它将检查是否通过该持有者进行了身份验证。如果它没有看到令牌(清除上下文时就是这种情况),它将使用resourcedetails中定义的oauth2配置查找新令牌。只需确保它引用的客户端具有所需的权限。

相关问题