1

给定一个根据某些用户权限显示对象(例如电影)的应用程序。

显示或创建对象的一般权限被实现为具有角色和权限的 RBAC。

访问具有某些属性的对象(例如具有“戏剧”属性的电影)的特定权限应通过成员资格来实现。这意味着该对象不具有“戏剧”属性,它是“戏剧”组的成员。如果用户和对象是同一组的成员,则用户具有访问该对象的特定权限。可以有不同的组用于显示、创建或删除对象,例如简单的查看器组或某种编辑器组。此外,还有一个表格指定了哪些组类型与对某些对象的某些操作相关。例如,对象“电影”上的动作“表演”的相关组可以是“类型”和“年龄”(电影对某些观众的适合性)。

以所描述的方式实现它的原因是在不接触代码的情况下具有很大的灵活性。可以在数据库中处理对组的更改。

通用数据库设计:

设计

示例:电影“The Revenant”是“genre:drama”和“age:18”组的成员。如果他也是这些组的成员,则用户可以访问它。

例子

这听起来像是一个好方法吗?是否有与这种方法类似的现有解决方案?它是否有很大的缺点(例如,数据库查询太多——每天可能有几百个用户)?

请与我分享您对这个问题的看法——选择“戏剧”作为示例的类别并非巧合;)我只是不知道这是一个死胡同还是我正朝着正确的方向前进。我在这一点上停留了很长一段时间。

4

1 回答 1

1

至少你有很好的幽默感:-)

你的方法听起来不错。只要您保持较低的参数数量,您就可以摆脱基于角色的访问控制 (RBAC) 和一些附加参数,例如组成员身份。

但从长远来看,如果你想实现业务驱动的授权(访问控制),你需要一种独立于你的代码的方式来做到这一点:你不希望每次有需求变化时都重写你的应用程序代码。

为此,有一个称为基于属性的访问控制 (ABAC) 的访问控制模型可以让您独立于代码定义授权策略。

在 ABAC 中,您有以下概念:

  • 定义策略执行点 (PEP) 和策略决策点 (PDP) 的架构。PEP 位于您的应用程序的前面(或内部)。它拦截业务请求(例如,观看电影的请求)并向 PDP 发送授权请求。PDP 配置有策略。根据请求,PDP 将做出决定:是,允许或否,拒绝。
  • 策略语言:策略语言是基于属性的(因此得名 ABAC)。这意味着您可以使用任意数量的属性(例如用户角色、用户 ID、用户组成员资格,还可以使用用户年龄、用户位置、用户订阅以及资源属性,例如电影评级、电影类别、电影价格...... )
  • 请求/响应方案:这是您请求授权的方式。它本质上是一个是/否流程。“用户可以做 X 吗?”,“是的,他们可以。”

ABAC 有几种实现方式——其中一些是特定于框架的,例如 CanCanCan。XACML 和 ALFA 是两种不依赖于任何特定框架的方法。您可以从任何一种语言的开源和商业实现中进行选择,例如:

  • 开源:SunXACML、ATT XACML
  • 商业:公理策略服务器
于 2017-02-13T19:38:48.780 回答