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

时间:2017-11-11 03:01:00

标签: firebase firebase-security google-cloud-firestore

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

我有一组用户和角色集合。用户对象有一个名为" role"这是对roles集合中特定文档的引用。

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;

如果有更好的方法来完成角色基础安全,我很满意。

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

2 个答案:

答案 0 :(得分:1)

我知道自原始问题以来已经有一段时间但是我有类似的问题,我希望这可以帮助你或其他人。

你的条件是: 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;

答案 1 :(得分:0)

您是否尝试将通配符移动到嵌套路径?

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth.uid == userId;
      match /{role=**} {
        allow read: if request.auth.uid != null;
        allow write: if isSuperUser();
      }
    }
  }
}