我试图弄清楚如何使用 Balana 的 XACML 实现(WSO2 的权利引擎基于 Balana)来实现授权机制。
当用户请求访问单个资源时(例如,bob 想要阅读医疗记录),事情就很简单了。
但是,假设 bob 想要阅读他所有患者的医疗记录。这里的第一个问题是需要有一种方法来弄清楚谁是他的病人。我还需要为他的患者的每条记录获取属性。问题是,我正在尝试解决这种情况,同时将我的 PIP 的属性请求数量保持在最低限度。
重新表述我的目标:我正在尝试根据 PIP 返回的属性(并且我希望我的 PIP例如,与数据库的交互尽可能少)。
简而言之,我发现当尝试使用 XACML 控制对资源集合的访问时,事情变得很棘手。
我在这里找到了一些选择:
我的请求包含主题、操作、资源 ID 和范围。我使用 XACML 多决策配置文件:PDP 知道子/后代资源是目标,因此它将为每个子/后代创建多个评估上下文(但尚未找到资源的属性)。然后,使用 PIP,它将检索每个单独评估上下文的属性(例如,获取 bob 的医生 ID,然后获取每个单独资源的医生 ID)。例如,如果我的 PIP 正在查询数据库,它将针对每个单独的请求对每个单独的属性执行大量查询,因此对性能有很大影响。
我的请求包含主题、操作、资源 ID。我不再使用多重决策配置文件。但是,在创建评估上下文并要求 PDP 评估我的请求之前,我知道我的资源实际上是一个集合,因此我以某种方式获取所有子/后代及其所有属性,并且只有在获得所有这些信息之后,我才手动创建个人决策对每个孩子/后代的请求,以及其中的所有相应属性。因此,我向 PDP 提出了一个重要的决策请求,其中包含几乎所有必要的属性。因为决策请求几乎具有评估上下文中的所有属性,所以不需要询问我的 PIP。这样做的好处是,我在 PDP 评估决策之前获得了所有信息,因此 PIP 必须做的工作保持在最低限度。
我的请求包含主题、操作、资源 ID。我使用多决策配置文件。我有一个可以找到儿童/后代资源和一些 PIP 的组件。所有这些组件都使用一个存储库,假设称为 MedicalRecordsRepository。当请求子/后代 ID 时,此 repo 还会从数据库中获取所有属性并将所有这些信息存储在缓存中。因此,之后,当有多个单独评估的评估上下文时,如果请求 PIP 返回一个属性,它将从 repo 的缓存中获取该属性。因此,数据库交互保持在最低限度。但是,问题在于存储库组件及其缓存。
我已经阅读了规范,我四处寻找,但我还没有找到任何解决这个问题的方法。有没有人有任何想法?提前致谢!