问题描述
在我工作的公司中;我们正在计划一个自定义权利服务(使用Open Policy Agent作为策略引擎),以进行细粒度的authZ决策。
启用了基本权利的微服务将身份(JWT主题),操作(GET / POST / PUT / PATCH / DELETE)和资源(/thing/12345
)传递给权利服务以获得authZ决策。该决定只是布尔值允许/拒绝响应。权利保留有关用户,组和角色的信息(从IDP和其他系统异步接收),因此它能够从本地数据源中查找此信息并将其传递给OPA(使用overloaded input pattern) 。 Entitlements / OPA只是作为独立的服务运行-我们没有将OPA作为辅助工具或类似的东西运行...
我们要解决的问题是,对于大多数路由而言,资源所有者不是资源路径的一部分,但是我们仍然需要资源所有者才能做出authZ决定。
我可以想到3种方法来使资源所有者获得权利。我正在寻求有关什么是最佳方法的建议。
- 在所有资源路径中包括资源所有者信息,例如
/user/{id}/thing/12345
。 TBH不确定这种方法在我们的生态系统中将如何可行,因此这可能是我的最低要求。 - 启用权利的服务需要查找资源所有者(对于给定资源),并将其传递给权利(以及身份,操作和资源)。
- 在创建资源时将资源标识符(映射到资源所有者)同步到权利,以便启用了权利的服务随后可以仅传递身份,操作和资源来获得authZ决定。
解决方法
这通常可以归结为关于内存消耗和数据更改频率的要求。尝试总结:
根据请求或政策进行权限数据查找
优点:
- 已知在做出决定时数据是最新的。
缺点:
- 所有额外查询都会增加总请求时间。在微服务架构等分布式环境中,影响可能很大。
在内存中保留权限数据
优点:
- 由于查找是通过内存完成的,因此通常很快。
缺点:
- 数据仅是上次同步的时间。
- 除非每次更新都推送所有数据是可行的,否则仅需实现和维护仅同步差异/增量的自定义逻辑。其复杂性在很大程度上取决于基础数据源。
- 取决于数据的大小,可能需要大量的内存-特别是在多个OPA实例之间分发时,因为它们都将携带数据的副本。