【发布时间】:2015-05-24 05:53:09
【问题描述】:
这不是关于有权在资源端点上发出 GET/POST/PUT/DELETE 请求。这是关于某些用户对某些资源具有 GET/POST/PUT/DELETE 请求权限。
在我们的应用程序中,我们使用以下 sqlalchemy 架构将其称为访问控制列表 (ACL)
class ACL(db.Model):
__tablename__ = 'acl'
id = db.Column(db.Integer, primary_key=True)
res_id = db.Column(db.Integer, nullable=True)
res_type = db.Column(db.String(50), nullable=True)
permission = db.Column(db.String(20), nullable=True)
is_allowed = db.Column(db.Boolean, default=True)
users = db.relationship("User", secondary=acl_users)
created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
此 ACL 与用户具有多对多关系,与每个资源具有多对一关系。这个 ACL 可以是四样东西:
- 如果 res_id 不为 null 且 users 不是空列表,则称为 "Exact",因为它指定了特定用户对特定资源的权限
- 如果 res_id 为 null 且 users 不是空列表,则称为 "Anything",因为它指定特定用户对任何资源的权限
- 如果 res_id 不为 null 且 users 为空列表,则称为 "Anyone",因为它指定了任何用户对特定资源的权限
- 如果 res_id 为 null 且 users 为空列表,则称为 "Any",因为它指定了任何用户对任何资源的权限
我不确定这种设计是否常见,但它似乎拥有定义资源权限所需的一切。
问题如下:
如果一个资源有多个 ACL,那么优先级应该是什么?
我们只有三个选择:
- 在 ACL 表中添加“优先级”列并让它确定优先级。这种方法很有意义,但创建按优先级考虑 ACL 的 Fetch Collection 查询将成为一场噩梦。
- 错误 >> 正确。例如“任何人”错误胜过“精确”正确。如果“任何人”设置为 False,则没有用户对该资源具有权限。这是最容易进行 Fetch Collection 查询的方法。
- 精确>>任何人>>任何东西>>任何东西。即使“Anyone”为 False,如果 Exact user 设置为 True,则除该用户之外的所有用户都具有权限。进行 Fetch Collection 查询既不容易也不不可能。
这三个选项中哪一个最能反映有关许可的常见做法?
【问题讨论】:
标签: rest permissions acl