XACML 3.0 和多种资源

2024-03-10

我试图弄清楚如何使用 Balana 的 XACML 实现来实现授权机制(WSO2 的权利引擎基于 Balana)。

当用户请求访问单个资源时(例如,鲍勃想要阅读医疗记录),事情就很简单了。

然而,假设鲍勃想要阅读他所有患者的医疗记录。这里的第一个问题是需要有一种方法来确定谁是他的病人。我还需要获取他的患者的每个单独记录的属性。问题是,我正在尝试解决这种情况,同时将对 PIP 属性的请求数量保持在最低限度。

重新表述一下我的目标:我正在尝试根据 PIP 返回的属性(并且我希望我的 PIP例如,与数据库的交互尽可能少)。

简而言之,我发现当尝试使用 XACML 控制对资源集合的访问时,事情会变得棘手。

我在这里找到了几个选项:

  1. 我的请求包含主题、操作、资源 ID 和范围。我使用 XACML 多重决策配置文件:PDP 知道子级/后代资源是有针对性的,因此它将为每个子级/后代创建多个评估上下文(但尚未找到资源的属性)。然后,使用 PIP,它将检索每个单独评估上下文的属性(例如,获取 bob 的医生 ID,然后获取每个单独资源的医生 ID)。例如,如果我的 PIP 正在查询数据库,它将针对每个单独的请求对每个单独的属性执行大量查询,因此对性能有很大影响。

  2. 我的请求包含主题、操作、资源 ID。我不再使用多重决策配置文件。然而,在创建评估上下文并要求 PDP 评估我的请求之前,我知道我的资源实际上是一个集合,因此我以某种方式获取所有子代/后代及其所有属性,并且只有在获得所有这些信息后,我才手动创建个人决策对每个子/后代的请求,并在其中填充所有相应的属性。因此,我向 PDP 提出了一份详细的决策请求,其中包含几乎所有必要的属性。由于决策请求几乎具有评估上下文中的所有属性,因此无需询问我的 PIP。这样做的好处是,我在 PDP 评估决策之前就获得了所有信息,因此 PIP 必须做的工作保持在最低限度。但是,我不确定我是否应该在到达 PDP 之前找到子级/后代及其所有属性(如 XACML 规范所述,在上下文处理程序中的某个位置)。

  3. 我的请求包含主题、操作、资源 ID。我使用多重决策配置文件。我有一个可以查找子代/后代资源和一些 PIP 的组件。所有这些组件都使用一个存储库,假设该存储库称为 MedicalRecordsRepository。该存储库在请求子代/后代 ID 时,还会从数据库获取所有属性并将所有这些信息存储在缓存中。因此,当有多个单独评估的评估上下文时,如果请求 PIP 返回一个属性,它将从存储库的缓存中获取该属性。因此,数据库交互保持在最低限度。然而,问题在于存储库组件及其缓存。

我已经阅读了规范,我进行了研究,但我还没有找到解决这个问题的方法。有人有什么想法吗? 提前致谢!


简而言之,我发现当尝试使用 XACML 控制对资源集合的访问时,事情会变得棘手。

你是对的。 XACML 很好地解决了事务和功能访问控制。它不能很好地处理数据访问控制。

  • 事务访问控制:Alice 可以查看医疗记录#1吗?
  • 功能访问控制:Alice 可以查看医疗记录吗?
  • 数据访问控制:Alice 可以查看哪些医疗记录?

我不确定我是否完全掌握了您的三种方法,但您确实强调了相关问题,即

  • 不知道有多少物品
  • 从外部属性源检索属性(想象每条医疗记录有 10 个属性乘以 1,000,000 条记录 - 即 1000 万次查找)

根据我的经验,当您有数千个请求时,多个决策配置文件请求效果很好。除此之外,我会考虑 Axiomatics 反向查询(免责声明 - 我为 Axiomatics 工作)。反向查询通过公开一个 API 来解决您的问题,该 API 允许您提出开放式问题,例如

  • Alice 可以查看哪些医疗记录?

响应将是必须满足的一组条件。例如,如果您的策略如下(使用 ALFA 表示法):

使用 ALFA 表示法的 XACML 策略

policy accessMedicalRecord{
    target clause com.axiomatics.examples.actionId == "view" and objectType == "medical record"
    apply firstApplicable
    /**
     * Doctors can view medical records of patients they are assigned to
     */
    rule allowRegularAccess{
        target clause user.role == "doctor"
        condition patient.assignedDoctor == user.identifier
        permit
    }               
}

ARQ 请求/响应示例

  • 请求:医生 Alice 可以查看哪些医疗记录?
  • 回应: 允许,如果patient.assignedDoctor == "Alice"

答案可以翻译成查询语言,例如SQL:

  • SELECT id FROM MED_RECORDS WHERE assignedDoc = 'Alice';

它也可能是另一种查询语言。然后,您可以使用它来查询数据源,例如SQL 数据库并检索相关医疗记录。

另请参阅此Stackoverflow 问答 https://stackoverflow.com/questions/50462996/xacml-how-to-efficiently-control-access-to-collections-lists-of-resources/50476992#50476992.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XACML 3.0 和多种资源 的相关文章

随机推荐

  • rownum / 获取前 n 行

    select from Schem Customer where cust 20 and cust id gt 890127 and rownum between 1 and 2 order by cust cust id 执行时间约2分1
  • 如何放大 Mapbox Leaflet 中的标记单击事件?

    我想在单击标记时放大该标记 我正在使用 Mapbox 和传单 I tried marker on click function e map setView e lat e lng 12 但这给了我某种错误 类型错误 t 为空 我什至尝试过
  • JOptionPane 显示选项对话框

    我想使用 JOptionPane 创建一个 showOptionDialog 它有两个按钮 公制和英制 如果单击 Metric 则会加载 Metric GUI 相反 如果单击 Imperial 则会加载 Imperial GUI 我该怎么做
  • 从头开始创建 LinkedList 类

    我们的任务是从头开始创建一个 LinkedList 但绝对没有任何读物来指导我们完成这项令人偏头痛的任务 而且网上的所有内容似乎都只是使用 Java 内置的 LinkedList 方法和东西 无论如何 当使用 Java 的默认内容时 链表非
  • 使用 pandas 将 JSON 输出为 CSV

    我正在尝试转换以下内容 json文件至 csv使用熊猫 输入 json 文件名 my json file json profile set doc type PROFILE key 123 mem list mem num 10001 cu
  • 正确生成带有特殊字符的站点地图 XML

    我有一个程序可以为 Google 网站管理员工具 除其他外 生成 XML 站点地图 GWT 给我提供了某些站点地图的错误 因为 URL 包含字符序列 如 等 站点地图规范说 https www sitemaps org protocol h
  • “interface”关键字是否从 Dart 中删除了?

    只是为了确定 Dart 是否删除了显式定义interface现在赞成通过隐式定义它abstract 我看到它提到Dart 和接口隔离原则 https stackoverflow com questions 20791286 dart and
  • 对列表中的每个 Id 进行多个 RestTemplate 调用

    我需要制作多个RestTemplate要求每个Id in a List
  • 编写指向其实现者的通用接口的便捷方法

    java中是否有一种编写通用接口的方法 以更方便的方式向此类接口的实现者指出 例如我写的接口 public interface Updatable
  • Mysql2::错误(用户'root'@'localhost'访问被拒绝(使用密码:NO)):

    只需在 CentOS 5 服务器 apache passenger 上使用 mysql mysql2 gem 设置一个新的 Rails 3 1 3 应用程序 我已经正确设置了一个数据库和该数据库的用户 并且我已将登录名和信息添加到我的数据库
  • 防止 TextView 中出现不需要的换行

    尽管设置如此 我的文本视图仍在换行文本lines 1 and ellipsise end 除了防止换行手出现带有 的文本省略号之外 我还需要做什么
  • 带 INNER JOIN 的 SQL DELETE

    有2张桌子 spawnlist and npc 我需要从中删除数据spawnlsit npc templateid n idTemplate是唯一 连接 表格的东西 我已经尝试过这个脚本 但它不起作用 我已经尝试过这个 DELETE s F
  • 如何在 unix 中解压 tar.bz 文件?

    我发现大量页面说明如何解压缩 tar bz2 文件 但是如何解压缩 tar bz 文件呢 use the j的选项tar tar xjf path to archive tar bz
  • 调用database.rawQuery时Android SQLiteMisuseException

    我在 Android 应用程序中使用 SQLite 数据库 有时在调用 database rawQuery String sql String SelectionArgs 时会收到 SQLiteMisuseException 这很奇怪 因为
  • 在 Canvas 上绘制两个 3D 字符串?

    我必须在画布上绘制 2 个字符串 字符串必须使用相同坐标第二根弦必须是第一根弦绕 Y 轴旋转 45 度的结果 结果必须如下所示 这是我的代码 Matrix matrix new Matrix matrix canvas getMatrix
  • 创建具有最大行数的表 (ORACLE)

    Oracle建表时有没有办法限制最大行数 如果表有数字键 您可以添加一个检查约束 声明该键不超过特定值 ALTER TABLE turnip ADD CONSTRAINT check turnip id CHECK turnip id lt
  • 如何在 Rust 中模拟特定方法而不是所有方法?

    我在确定目标结构的方法的单元测试时遇到了麻烦 我有一个方法random number根据结构体的属性返回一个随机值 还有另一种方法plus one它获取第一个方法的结果并用它做一些事情 pub struct RngTest pub attr
  • Flutter Google Maps - 根据行驶方向旋转标记

    任何人都可以分享 Flutter 谷歌地图插件的文档 代码示例 我可以在其中根据行驶方向旋转标记 例如 汽车图标 我看到这可以通过旋转标记在本机库上实现 但在 Flutter 中找不到任何旋转标记的选项 我想我们在旋转标记时需要考虑以下几点
  • 匹配 gtksourceview 中的整个字符串

    使用这个简短的 XML 片段在 gtksourceview 中定义字符串
  • XACML 3.0 和多种资源

    我试图弄清楚如何使用 Balana 的 XACML 实现来实现授权机制 WSO2 的权利引擎基于 Balana 当用户请求访问单个资源时 例如 鲍勃想要阅读医疗记录 事情就很简单了 然而 假设鲍勃想要阅读他所有患者的医疗记录 这里的第一个问