我正在寻找在我的应用程序中实现授权(而不是身份验证)方案的方法。
目前系统中有两个角色: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 可能具有以下模型操作:
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,则权限有效。
无论如何,我想我已经找到了一个细粒度的权限设计模式。如果不是,请随时对我进行有关该主题的教育。
我的问题的实际焦点涉及以下内容:
我的一些模型具有时间相关的动作。例如,您只能在 created_at 日期后不超过 24 小时内删除模型 Y。
我在想的是在创建模型时自动创建一个 cron 作业,该作业将在发生这种情况的日期更新权限。对于模型 Y,我想在 user_permissions 中插入一条记录,以撤销该模型的“删除”操作。
我的问题是:这是可取的吗?
编辑
如果我在 SQL 表中包含另一行,它指定了“翻转”(flipDate) 权限的日期,该怎么办?如果定义了翻转日期,并且如果当前日期在翻转日期之后,则权限被撤销。这似乎比一系列 cron 作业更容易管理,尤其是在模型可能更新时。