在Firestore规则中访问数据库参考

时间:2020-08-02 01:06:22

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

我正在努力访问Firestore规则中的文档引用。我的数据库看起来像这样。 (为简便起见,已简化):

curriculum 
   session1

roles
   admin
       --- canEditContent
   user
       --- canEditContent

users
   userid
      --- role
          roles/admin <document reference>

我想根据文档参考访问管理员权限。

我尝试了几种方法,但似乎无济于事。到目前为止,这是我的代码

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    function isSignedIn() {
      return request.auth != null;
    }
    function getUser() {
      return get(/databases/$(database)/documents/users/$(request.auth.uid));
    }
    function getUserRole() {
      let role = get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role;
      return get(role);
    }
    match /curriculum/{curriculum} {
      allow write: if isSignedIn() && getUserRole().data.canEditContent;
    }
    match /users/{userId} {
      allow read, update, delete, write: if request.auth != null && request.auth.uid == userId;
      allow create: if request.auth != null;
    }
  }
}

我尝试了很多方法,但似乎无法解决。

预先感谢

编辑

在集合下方添加了屏幕截图

将角色显示为文档的用户集合,引用到角色集合中的角色文档。 Users collection

角色集合 Roles collection

1 个答案:

答案 0 :(得分:1)

我可以在您的规则中看到两个问题:

  1. get需要完整的文档路径,因此您的功能getUserRole无法正常工作。尝试以下方法:

    function getUserRole() {
      let role = getUser().data.role;
      return get(path("/databases/" + database + "/documents/" + role));
    }
    
  2. 您的规则使用角色canEditContent,但是您显示的数据使用editContent,是故意的吗?

如前所述,请提供完整的数据,查询和规则集,在这里我们看不到您正在使用的查询。另外请注意,您可以使用Firestore模拟器获取有关失败规则和失败规则的信息。