Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Permissions 允许基于日期访问的权限设计模式_Permissions_Authorization_Role Base Authorization - Fatal编程技术网

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

Permissions 允许基于日期访问的权限设计模式,permissions,authorization,role-base-authorization,Permissions,Authorization,Role Base Authorization,我正在寻找在我的应用程序中实现授权(而不是身份验证)方案的方法 目前系统中有两个角色:A和B,但可能还有更多。用户的角色只有一个 基本上,我现在设置的是两个数据库表。一个用于模型上基于角色的权限,另一个用于特定的基于用户的权限。我认为,通过这种方式,用户可以基于其基于角色的权限拥有一组默认权限,但也可以授予/撤销特定权限 例如: table: user_permissions columns: user_id: [int] action: [string] allowed

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

目前系统中有两个角色: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\u permissions
表中,
allowed
字段指定是否允许该操作,以便在该值为0时可以撤销权限

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

table: model_actions
columns:
    action: [string]
    bitvalue: [int]
    model_type: [string]
我这样做是为了在检查模型的权限时,例如['create','delete'],我可以使用位and操作来比较用户的权限和我正在检查的权限。例如,模型X可以具有以下模型动作:

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\u操作表将其表示为110。当我检查是否可以创建模型X时,我使用create是4这一事实来构造位数组100。如果110和100的按位AND运算为100,则权限有效

无论如何,我想我已经找到了一个粒度权限设计模式。如果没有,请随意教我这个问题

我的问题的实际重点是:

我的一些模型具有与时间相关的操作。例如,您只能在创建日期不超过24小时后删除模型Y

我的想法是在创建模型时自动创建一个cron作业,该作业将在发生此情况时更新权限。在模型Y的情况下,我希望在用户权限中插入一条记录,以撤销此模型的“删除”操作

我的问题是:这样做明智吗

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

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

在授权的历史上,有一种传统的、被广泛接受的模型,称为基于角色的访问控制(RBAC)。当您有一组明确定义的角色以及这些角色之间的层次结构时,该模型工作得非常好

但是,当层次结构不清晰,或者存在关系(例如医患关系)或者存在动态属性(例如时间、位置、IP…)时,RBAC无法正常工作。几年前出现了一种称为基于属性的访问控制(ABAC)的新模型。在某种程度上,它是RBAC的一种进化或推广。使用ABAC,您可以根据属性定义授权逻辑。属性是一组描述用户、操作、资源和上下文的键值对。通过属性,您可以描述任意数量的授权情况,例如:

  • 医生可以在上午9点到下午5点之间查看患者的病历,如果且仅当患者被指定给该医生时
  • 当且仅当患者与护士属于同一诊所时,护士才能编辑患者的病历
ABAC支持所谓的PBAC或基于策略的访问控制,因为现在授权逻辑从专有代码和数据库方案转移到一组集中管理的策略中。这些策略的事实标准是XACML,一种可扩展的访问控制标记语言

简而言之,XACML允许您以一种技术中立的方式,以一种解耦的、外部化的方式来完成所需的工作。这意味着,您可以定义一次授权,并在任何重要的地方强制执行授权

我建议您查看这些关于该主题的优秀资源:

  • NIST对RBAC(旧模型)的支持
  • NIST的ABAC(你需要的模型)
  • OASIS(实现ABAC的标准)
  • 高德纳
  • 库皮格·科尔氏
  • 是一个用于编写基于属性的策略的工具

  • 实际上,。。这个答案值得悬赏,因为它指向了已经存在的解决方案。而且,它也让我意识到,授权可以集成到域中,但可以与域分离。由于授权可以(可选)对域模型进行操作,因此它也可以忽略该模型。而且,接口(端口和适配器模式)实现将定义权限,域实现不依赖于授权,但稍后可以开发复杂的授权实现,或者可以使用一些外部系统实现授权。谢谢,非常感谢