首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >XACML 3.0和多种资源

XACML 3.0和多种资源
EN

Stack Overflow用户
提问于 2018-06-06 03:13:38
回答 1查看 902关注 0票数 2

我正在尝试弄清楚如何使用Balana的XACML实现实现授权机制(WSO2的授权引擎是基于Balana的)。

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

但是,假设bob想要阅读他所有病人的医疗记录。这里的第一个问题是,需要有一种方法来找出谁是他的病人。我还需要他的病人的每一份个人记录的属性。问题是,我正在努力解决这种情况,同时将对我的PIP的属性请求数量保持在最小。

换句话说,我的目标是:我正在尝试根据PIP返回的属性评估Bob是否有权访问多个医疗记录(在创建决策请求时,这些记录是未知的)(例如,我希望我的PIP与数据库的交互尽可能少)。

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

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

  1. My request包含主题、操作、资源ID和范围。我使用XACML Multiple Decision profile: PDP知道子资源/子资源是目标资源,因此它将为每个子资源/子资源创建多个评估上下文(但尚未找到资源的属性)。然后,使用PIP,它将检索每个单独评估上下文的属性(例如,获取bob的医生ID,然后获取每个单独资源的医生ID )。例如,如果我的PIP正在查询数据库,它将为每个单独的请求为每个单独的属性执行大量查询,因此对性能有很大的影响。
  2. 我的请求包含主题、操作、资源ID。我不再使用多决策配置文件。然而,在创建评估上下文并要求PDP评估我的请求之前,我知道我的资源实际上是一个集合,所以我以某种方式获取了所有子代/子代及其所有属性,只有在获得所有这些信息之后,我才手动为每个子代/子代创建单独的决策请求,并在其中填充所有相应的属性。所以我给了PDP一个胖的决策请求,它几乎包含了所有必要的属性。由于决策请求在评估上下文中几乎具有所有属性,因此不需要询问我的PIP。这样做的好处是,我在PDP评估决策之前就得到了所有信息,所以PDP必须做的工作保持在最低限度。但是,我不确定是否应该在到达PDP之前找到子代/子代和它们的所有属性(正如XACML规范所说的,在上下文处理程序的某个地方)。
  3. 我的请求包含主题、操作、资源ID。我使用多决策配置文件。我有一个组件,可以找到孩子/后代资源,以及一些PIP。所有这些组件都使用存储库,假设该存储库称为MedicalRecordsRepository。当请求子代/子代in时,此存储库还从数据库中获取所有属性,并将所有这些信息存储在缓存中。因此,之后,当有多个单独计算的求值上下文时,如果PIP被请求返回一个属性,它将从repo的缓存中获取该属性。因此,数据库交互被保持在最低限度。但是,问题出在存储库组件及其缓存上。

我已经阅读了规范,我到处挖掘,但我还没有找到任何解决这个问题的方法。有谁有什么想法吗?提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-07 04:06:43

简而言之,我发现当尝试使用

控制对资源集合的访问时,事情变得很棘手。

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

  • 事务访问控制: Alice可以查看病历#1吗?
  • 功能访问控制: Alice可以查看病历吗?
  • 数据访问控制: Alice可以查看哪些病历?

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

are

  • retrieving
  • 不知道有多少项来自外部属性源的属性(假设每个医疗记录有10个属性乘以1,000,000条记录-这相当于10M次查找)

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

  • 爱丽丝可以查看哪些医疗记录?

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

使用ALFA表示法的XACML策略

代码语言:javascript
复制
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请求/响应

view?

  • Response: Request:如果patient.assignedDoctor == "Alice"

,医生Alice,

  • 可以允许哪些医疗记录

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

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

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

另请参阅此Stackoverflow Q&A

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50707394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档