use*_*763 2 permissions authorization role-base-authorization
我正在寻找在我的应用程序中实现授权(非身份验证)方案的方法。
系统中目前有两个角色:A 和 B,但可能还有更多。用户只有一个角色。
基本上,我现在设置的是两个数据库表。一种是针对模型的基于角色的权限,另一种是针对特定用户的权限。我认为这样,用户可以根据他们基于角色的权限拥有一组默认权限,但他们也可以授予/撤销特定的权限。
例如:
table: user_permissions
columns:
user_id: [int]
action: [string]
allowed: [boolean]
model_id: [int]
model_type: [string]
table: role_permissions
columns:
role: [int]
action: [string]
model_type: [string]
Run Code Online (Sandbox Code Playgroud)
在user_permissions表中,该allowed字段指定是否允许该操作,因此如果该值为 0,则可以撤消权限。
在另一个表中,我有每个动作的定义:
table: model_actions
columns:
action: [string]
bitvalue: [int]
model_type: [string]
Run Code Online (Sandbox Code Playgroud)
我这样做是为了当我检查模型的权限时,例如 ['create', 'delete'],我可以使用按位和操作来比较用户的权限和我正在检查的权限。例如,模型 X 可能具有以下 model_actions:
action: 'create'
bitvalue: 4
model_type: X
action: 'delete'
bitvalue: 2
model_type: X
action: 'view'
bitvalue: 1
model_type: X
Run Code Online (Sandbox Code Playgroud)
如果我的用户/角色权限指定模型 X 的创建、查看和删除操作分别为 1、0 和 1,则根据model_actions表将其表示为 110 。当我检查是否可以创建模型X时,我使用create为4的事实来构造位数组100。如果110和100的按位AND运算为100,则该权限有效。
无论如何,我想我已经找到了一个细粒度的权限设计模式。如果不是,请随时就该主题对我进行教育。
我的问题的实际重点涉及以下方面:
我的一些模型具有与时间相关的动作。例如,您只能在其 created_at 日期之后不超过 24 小时删除模型 Y。
我在想的是在创建模型时自动创建一个 cron 作业,它将在发生这种情况的日期更新权限。在模型 Y 的情况下,我想在 user_permissions 中插入一条记录,以撤销该模型的“删除”操作。
我的问题是:这是可取的吗?
如果我在 SQL 表中包含另一行,该行指定了“翻转”(flipDate) 权限的日期,该怎么办?如果定义了翻页日期,并且当前日期在翻页日期之后,则权限被撤销。这似乎比一系列 cron 作业更容易管理,尤其是在模型可能更新时。
您的模型看起来不错,但是...您正在重新发明轮子,正如您自己意识到的那样,您的模型不够灵活,无法满足其他参数(例如时间)的需求。
在授权的历史上,有一种传统的、广为接受的模型,称为基于角色的访问控制(RBAC)。当您有一组明确定义的角色和这些角色之间的层次结构时,该模型非常有效。
但是,当层次结构不那么清晰或存在关系(例如医患关系)或存在动态属性(例如时间、位置、IP...)时,RBAC 无法正常工作。几年前出现了一种称为基于属性的访问控制 (ABAC) 的新模型。在某种程度上,它是 RBAC 的演变或泛化。使用 ABAC,您可以根据属性定义授权逻辑。属性是一组键值对,用于描述用户、操作、资源和上下文。使用属性,您可以描述任意数量的授权情况,例如:
ABAC 支持人们可以称之为 PBAC 或基于策略的访问控制,因为现在授权逻辑从专有代码和数据库方案转移到一组集中管理的策略。这些策略的实际标准是 XACML,即可扩展访问控制标记语言。
简而言之,XACML 允许您以一种技术中立的方式、一种解耦的、外化的方式做您正在寻找的事情。这意味着,您可以定义一次授权并在任何重要的地方执行它。
我建议您查看有关该主题的这些重要资源:
| 归档时间: |
|
| 查看次数: |
1729 次 |
| 最近记录: |