允许基于日期的访问的权限设计模式

问题描述 投票:2回答:1

我正在寻找在我的应用程序中实现授权(而非身份验证)方案的方法。

当前系统中有两个角色: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]        

user_permissions表中,allowed字段指定是否允许该操作,因此,如果此值为0,则可以撤消权限。

在另一个表中,我具有每个动作的定义:

table: model_actions
columns:
    action: [string]
    bitvalue: [int]
    model_type: [string]

我这样做是为了当我检查模型的权限时,例如['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

如果我的用户/角色权限指定模型X的创建,查看和删除操作分别为1、0和1,则基于model_actions表,这表示为110。当我检查是否可以创建模型X时,我使用create为4来构造位数组100的事实。如果110和100的按位与运算为100,则该许可有效。

无论如何,我认为我已经找到了一种精细的权限设计模式。如果不是这样,请随时对我进行有关此主题的教育。

我的问题的实际重点涉及以下内容:

我的某些模型具有与时间有关的动作。例如,您只能在创建日期之后24小时内删除模型Y。

我想的是在创建模型时自动创建cron作业,该模型将在发生日期更新权限。对于模型Y,我想在user_permissions中插入一条记录,以撤销此模型的“删除”操作。

我的问题是:这建议吗?

编辑

如果我在SQL表中包括另一行,该行指定了允许翻转的日期(flipDate),该怎么办?如果定义了flipDate,并且当前日期在翻转日期之后,则权限被撤消。这似乎比一系列cron作业更容易管理,尤其是在可能更新模型时。

permissions authorization role-base-authorization
1个回答
4
投票

您的模型看起来不错,但是...您正在重新发明轮子,并且您意识到自己的模型不够灵活,无法满足其他参数的要求,例如时间。

在授权的历史中,有一个传统的,公认的模型,称为基于角色的访问控制(RBAC)。当您具有一组明确定义的角色以及这些角色之间的层次结构时,该模型非常有效。

但是,当层次结构不清晰或存在关系(例如医患关系)或存在动态属性(例如时间,位置,IP ...)时,RBAC不能很好地工作。几年前出现了一种新的模型,称为基于属性的访问控制(ABAC)。从某种意义上讲,它是RBAC的演变或概括。使用ABAC,您可以根据属性定义授权逻辑。属性是一组键值对,描述用户,操作,资源和上下文。使用属性,您可以描述许多授权情况,例如:

  • [并且只有在将患者分配给该医生之后,医生才能查看该患者的病历
  • [并且仅当患者与护士属于同一诊所时,护士才能编辑患者的病历。

ABAC启用了所谓的PBAC或基于策略的访问控制,因为现在授权逻辑从专有代码和数据库方案转移到一组集中管理的策略中。这些策略的实际标准是XACML(可扩展访问控制标记语言)。

简而言之,XACML使您可以以技术中立的方式,以分离的,外部化的方式来完成所需的工作。这意味着,您只需定义一次授权,然后在所有重要的地方都执行它。

我建议您查看有关该主题的这些丰富资源:

© www.soinside.com 2019 - 2024. All rights reserved.