【问题标题】:Designing resource permission priority for RESTful为 RESTful 设计资源权限优先级
【发布时间】: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 可以是四样东西:

  1. 如果 res_id 不为 null 且 users 不是空列表,则称为 "Exact",因为它指定了特定用户对特定资源的权限
  2. 如果 res_id 为 null 且 users 不是空列表,则称为 "Anything",因为它指定特定用户对任何资源的权限
  3. 如果 res_id 不为 null 且 users 为空列表,则称为 "Anyone",因为它指定了任何用户对特定资源的权限
  4. 如果 res_id 为 null 且 users 为空列表,则称为 "Any",因为它指定了任何用户对任何资源的权限

我不确定这种设计是否常见,但它似乎拥有定义资源权限所需的一切。

问题如下:

如果一个资源有多个 ACL,那么优先级应该是什么?

我们只有三个选择:

  1. 在 ACL 表中添加“优先级”列并让它确定优先级。这种方法很有意义,但创建按优先级考虑 ACL 的 Fetch Collection 查询将成为一场噩梦。
  2. 错误 >> 正确。例如“任何人”错误胜过“精确”正确。如果“任何人”设置为 False,则没有用户对该资源具有权限。这是最容易进行 Fetch Collection 查询的方法。
  3. 精确>>任何人>>任何东西>>任何东西。即使“Anyone”为 False,如果 Exact user 设置为 True,则除该用户之外的所有用户都具有权限。进行 Fetch Collection 查询既不容易也不不可能。

这三个选项中哪一个最能反映有关许可的常见做法?

【问题讨论】:

    标签: rest permissions acl


    【解决方案1】:

    我不知道这些都是常见的,一般来说,这种模式与我过去看到的权限有点不同。 (顺便说一句,我在查找其他人如何为我自己的问题授予权限时发现了这篇文章,所以感谢不同的观点!)

    我以前的系统遵循非常标准的角色+权限+用户系统。 (许多)用户可以分配到(许多)角色。 (许多)角色可以有一个(一个)父角色。 (许多)角色和(许多)用户可以分配(许多)权限。权限是允许或拒绝以及正在控制的操作或资源。我们也有一个“中立”权限,但这并不是真正必要的,而且往往会使已经很复杂的系统变得更糟。

    我构建的方式是,更具体的权限会覆盖不太具体的权限,因此用户胜过角色胜过 ParentRole。在同一级别内,拒绝胜过允许。不相关的角色是“同一级别”,任何一个对象的所有权限也是如此。没有单独的优先级控制使事情复杂化,角色的层次结构将其融入其中,任何特定于用户的东西都尽可能地狭窄。

    因此,要回答您的问题,我认为您需要将 2 和 3 混合使用,或者很可能只使用 3,因为您不会在一个级别上真正拥有冲突的权限。确切的权限应该总是获胜。然后我会说任何东西都胜过任何人,因为“任何东西”仍然特定于一个主题,而“任何人”特定于资源而不是任何特定用户。 Any 显然是最不重要的,基本上作为默认值。

    【讨论】:

      猜你喜欢
      • 2014-07-02
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多