检查权利/ authZ时在哪里解析资源所有者

问题描述

在我工作的公司中;我们正在计划一个自定义权利服务(使用Open Policy Agent作为策略引擎),以进行细粒度的authZ决策。

高级架构如下所示:

enter image description here

启用了基本权利的微服务将身份(JWT主题),操作(GET / POST / PUT / PATCH / DELETE)和资源(/thing/12345)传递给权利服务以获得authZ决策。该决定只是布尔值允许/拒绝响应。权利保留有关用户,组和角色的信息(从IDP和其他系统异步接收),因此它能够从本地数据源中查找此信息并将其传递给OPA(使用overloaded input pattern) 。 Entitlements / OPA只是作为独立的服务运行-我们没有将OPA作为辅助工具或类似的东西运行...

我们要解决的问题是,对于大多数路由而言,资源所有者不是资源路径的一部分,但是我们仍然需要资源所有者才能做出authZ决定。

我可以想到3种方法来使资源所有者获得权利。我正在寻求有关什么是最佳方法的建议。

  1. 在所有资源路径中包括资源所有者信息,例如/user/{id}/thing/12345。 TBH不确定这种方法在我们的生态系统中将如何可行,因此这可能是我的最低要求。
  2. 启用权利的服务需要查找资源所有者(对于给定资源),并将其传递给权利(以及身份,操作和资源)。
  3. 在创建资源时将资源标识符(映射到资源所有者)同步到权利,以便启用了权利的服务随后可以仅传递身份,操作和资源来获得authZ决定。

解决方法

这通常可以归结为关于内存消耗和数据更改频率的要求。尝试总结:

根据请求或政策进行权限数据查找

优点:

  • 已知在做出决定时数据是最新的。

缺点:

  • 所有额外查询都会增加总请求时间。在微服务架构等分布式环境中,影响可能很大。

在内存中保留权限数据

优点:

  • 由于查找是通过内存完成的,因此通常很快。

缺点:

  • 数据仅是上次同步的时间。
  • 除非每次更新都推送所有数据是可行的,否则仅需实现和维护仅同步差异/增量的自定义逻辑。其复杂性在很大程度上取决于基础数据源。
  • 取决于数据的大小,可能需要大量的内存-特别是在多个OPA实例之间分发时,因为它们都将携带数据的副本。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...