firebase - Firestore 安全规则使用对另一个文档的引用

标签 firebase firebase-security google-cloud-firestore

我正在尝试将安全规则建立在对另一个对象的引用上。

我有一组用户和一组角色。用户对象有一个名为“role”的字段,它是对角色集合中特定文档的引用。

users
  id
  name
  role <-- reference to particular role

roles
  id
  name
  isSuperUser

这里的目标是允许具有特定角色(isSuperUser == true 的角色)的用户编辑任何其他角色或其子集合;

以下是我认为会奏效的规则:
service cloud.firestore {
   match /databases/{database}/documents {
    match /users/{userId=**} {
     allow read, write: if request.auth.uid == userId;
   }
   match /roles/{roleId=**} {
      function isSuperUser() {
       return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role.isSuperuser == true;
      }
      allow read: if request.auth.uid != null;
      allow write: if isSuperUser();
   }
}

我已经确认了以下作品,但它并不是那么有用......
get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role != null;

如果有更好的方法来实现角色基础安全,我会全力以赴。

缺乏任何调试工具使这非常令人沮丧。

最佳答案

我知道距离最初的问题已经有一段时间了,但我遇到了类似的问题,我希望这可以帮助您或其他人。

你的情况是:get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role.isSuperuser == true;
但是role是一个引用,这(显然)意味着您需要 get它也是。尝试这个:
get(get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role).data.isSuperuser == true;

关于firebase - Firestore 安全规则使用对另一个文档的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47233942/

相关文章:

ios - Swift Firebase - 获取多个 uid,然后将这些 uid 添加到一个 child

android - 版本冲突 Firebase 库

firebase - 如何配置 Firebase 项目的规则以确保安全?

angular - 使用 AngularFirestore 集合 orderBy 和 snapShotChanges 方法

javascript - 如果我们刷新浏览器窗口,在 javascript 中创建的 firestore 实时 onsnapshot 监听器是否会自行分离?

java - 为什么我的 Cloud Run - 到 Firebase 调用需要这么长时间?

javascript - firestore 查询中的条件 where 子句

database - 在保存之前验证 Firebase JSON 的结构

android - 规则条目重复 firebase 不工作

java - 如何处理我的数据模型类以将 Firebase Firestore 数据导入 recyclerView?