0

一般来说,我是无服务器架构的新手,我正在研究将我当前的 php/mysql rest api 迁移到无服务器架构。

我主要关心的是访问控制。

在某些应用程序中,我允许用户根据角色和分配给他们的组访问内容“

例子

角色:用户:[1,2,3] 只能访问以下内容group_id:1 || 2 || 3

是否有可能在无服务器数据库中进行这样的访问控制,比如动物区系数据库?

4

1 回答 1

2

可以使用 FaunaDB 进行此类访问控制,而 ABAC 系统则可以进行更多操作(https://docs.fauna.com/fauna/current/security/abac.html

角色:

本质上你有角色,这些角色提供权限

CreateRole({
  name: "access_todos",
  privileges: [{
    resource: Collection("todos"),
    actions: {
      create: true,
      update: true,
      delete: true,
      write: true
    }
  }]
})

(您可能会注意到,这当然可以访问所有不是您想要的组,我们会解决的)

角色可以分配给不同的事物:

  • Keys:只需使用该角色创建一个密钥,该密钥只​​能访问组集合
  • 函数:用户定义函数(如存储过程)可以承担角色。
  • 集合中的实体或集合的一部分:任何实体(例如用户、ShareLinks、帐户)都可以通过添加“成员资格”来分配角色。

角色成员资格(将角色分配给数据库实体):

您可以使用成员资格字段将角色分配给数据库实体。在这种情况下,您数据库中的所有帐户都将拥有这些权限。您还可以使用此处的功能来过滤掉某种类型的帐户等。

CreateRole({
  name: "access_todos",
  membership: [{ resource: Collection("accounts") }],
  privileges: [{
    resource: Collection("todos"),
    actions: {
      create: true,
      update: true,
      delete: true,
      write: true
    }
  }]
})

假设该实体的身份,(获取该数据库实体的密钥):

那么这给我们留下了一个问题:“我们如何假设用户的身份?”。我们为此使用登录。首先,您使用密码创建一个帐户:

Create(
    Class("account"),
    {
      data: { email: "alice@example.com" }
      credentials: { password: "secret password" },
    }));

重要的部分是 credentials.password 字段,它是 FaunaDB 的一个特殊字段。它将被加密,当数据库实体有这样的密码时,您可以使用Login来假设实体的身份:

Login(
    Index("accounts_by_email"), "alice@example.com"),
    { password: "secret password" })

登录将为您提供一个令牌,该令牌现在将拥有该帐户的所有权限。或者换句话说,集合'accounts'的这个数据库实体是成员的角色的所有特权(并且成员资格是使用成员资格密钥在角色上定义的)

Role 谓词和“Identity()”函数的强大功能

好的,但是我们如何获得更细粒度的访问?角色可以有 lambda 谓词而不是布尔值。这意味着在您的情况下,您可以将组数组存储在用户上(反之亦然)并将帐户链接到用户。

privileges: [
  {
    resource: Collection("Groups"),
    actions: {
      read: Query(
        Lambda("groupReference",
          // Write your logic
        )
      )
    }
  }
]

在这样的查询中,lambda 参数是您尝试访问的实体(例如组)的引用。还有一个问题.. 我们如何检查链接到帐户的用户是否可以访问组?我们使用“Identity()”作为 FQL 函数,它返回当前登录的数据库实体的引用。

注意:默认情况下,您可以获得对您登录的实体的读/写访问权限。因此,您不想将组 ID 存储在帐户中,因为理论上用户可以更改这些 ID。这就是我在解释中拆分帐户和用户的原因。我们可能会在未来的 FQL 版本中对此进行更改,因为这似乎令人困惑/麻烦。

一些好的资源: - ABAC 文档:https ://docs.fauna.com/fauna/current/security/abac.html - 带有 GraphQL 的 ABAC : https ://medium.com/fauna/abac-graphql-6e3273945b1c - 身份验证文档:https ://app.fauna.com/tutorials/authentication#creating-users

我们正在构建一个完整的示例,我希望在接下来的几周内出现在我们的博客上。

于 2020-02-05T12:13:18.670 回答