首页 > 解决方案 > 基于角色的 Firestore 规则

问题描述

我们需要在 firebase 规则中验证用户的角色。用户可以具有以下角色之一:SUPPORT、ADMIN、MODERATOR。

User 对象包含一个角色集合,因此我们可以将一些元数据放在相应的角色上: User Object

我试图在我的 firestore 规则中使用这个集合,但我还没有成功:

    function getUserRoles(userId) {
        return get(/databases/$(database)/documents/users/$(userId)/roles);
    }

    function hasRole(userId, role) {
        return getUserRoles(userId) in role;
    }

不幸的是,我无法在文档中找到如何检查角色列表是否包含请求role作为文档 ID 的内容。

标签: google-cloud-firestorefirebase-security

解决方案


get()只能获取单个文档,而不是整个集合。所以,你现在正在尝试的是不可能的。另请记住,get()每个请求最多只能包含 10 个文档。

考虑这样重写hasRole,以检查用户的角色集合是否包含具有命名权限的文档:

function hasRole(userId, role) {
    return exists(/databases/$(database)/documents/users/$(userId)/roles/$(role))
}

这假定role是角色的字符串名称,例如“SUPPORT”。您必须为要检查的每个单独角色调用此函数。

如果您还需要检查文档的内容,则必须改为检查文档get()的字段。


推荐阅读