一般来说,我是无服务器架构的新手,我正在研究将我当前的 php/mysql rest api 迁移到无服务器架构。
我主要关心的是访问控制。
在某些应用程序中,我允许用户根据角色和分配给他们的组访问内容“
例子
角色:用户组:[1,2,3] 只能访问以下内容group_id
:1 || 2 || 3
是否有可能在无服务器数据库中进行这样的访问控制,比如动物区系数据库?
一般来说,我是无服务器架构的新手,我正在研究将我当前的 php/mysql rest api 迁移到无服务器架构。
我主要关心的是访问控制。
在某些应用程序中,我允许用户根据角色和分配给他们的组访问内容“
例子
角色:用户组:[1,2,3] 只能访问以下内容group_id
:1 || 2 || 3
是否有可能在无服务器数据库中进行这样的访问控制,比如动物区系数据库?
可以使用 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
}
}]
})
(您可能会注意到,这当然可以访问所有不是您想要的组,我们会解决的)
角色可以分配给不同的事物:
您可以使用成员资格字段将角色分配给数据库实体。在这种情况下,您数据库中的所有帐户都将拥有这些权限。您还可以使用此处的功能来过滤掉某种类型的帐户等。
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'的这个数据库实体是成员的角色的所有特权(并且成员资格是使用成员资格密钥在角色上定义的)
好的,但是我们如何获得更细粒度的访问?角色可以有 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
我们正在构建一个完整的示例,我希望在接下来的几周内出现在我们的博客上。