我试图使用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中的令牌。
1条答案
按热度按时间ljsrvy3e1#
最后,我只是清理了背景,然后打了剩下的电话:
当oauth2resttemplate进行调用时,它将检查是否通过该持有者进行了身份验证。如果它没有看到令牌(清除上下文时就是这种情况),它将使用resourcedetails中定义的oauth2配置查找新令牌。只需确保它引用的客户端具有所需的权限。