在我的设置中,有一个JavaScript应用程序在浏览器上运行,它由Spring WebMVC应用程序提供服务,该应用程序实现了后端前端(BFF)模式。用户访问令牌存储在BFF服务器会话对象中。BFF使用client credentials flow在支持的REST API服务器上调用REST API。用户通过Auth 0 iDP进行身份验证。我们还使用Auth 0为client-credentials-flow提供凭证。当BFF启动时,它调用Auth 0并获取访问令牌以与REST API一起使用。每当BFF对REST服务器进行rest调用时,它都会传递访问令牌。一切正常。
但是,REST API不使用安全主体,因此我们无法基于安全主体实现访问控制。我希望能够使用**@PreAuthorizeannotation来确保正在更新的实体属于Security主体。(假设我要保护的每个实体都是字段“ownerid”)。
我希望BFF传递一些关于经过身份验证的用户的信息沿着其访问令牌。我想为这个执行上下文示例化一个Security主体,以便@PreAuthorize**注解可以使用此信息。
1条答案
按热度按时间c2e8gylq1#
BFF应该将用户级令牌转发到REST API。这样做可以以可验证和可审计的方式安全地传递用户身份。
API应该以与当前相同的方式处理令牌。根据您的喜好,可以使用各种编码技术来提取主体。
如果BFF发送由客户端证书流获得的单独令牌,则需要在单独的普通HTTP报头中传递用户ID /主题。这不是一个好的安全实践,例如中间的人可能会将其更改为不同的用户。
如果API拒绝了令牌,可能会回发原因。例如,API可能基于其受众声明值拒绝访问令牌,或者缺少所需的范围。
OAuth UI和API流应该以端到端的方式设计,其中客户端被赋予提供对一个或多个API的访问的范围,同时安全地流动用户身份。
客户端凭据流最好用于机器启动的端到端流程。一个示例可能是夜间批处理作业。