Firestore安全规则get()不起作用

时间:2017-10-08 08:45:58

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

解决方案是在帖子的最后。看看吧。

Решениепроблемывконцепоста。 Дочитайте。

只是一个简单的问题:这是错误的,为什么这不起作用?

尝试与 / titles / {anyTitle} / titles / {anyTitle} 中具有“admin”角色的用户进行访问

  

权限缺失或不足

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow write: if false;
      allow read: if false;
    }
    function userCanWrite () {
      return get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
    }
    match /titles/{anyTitle=**} {
      allow read: if request.auth != null;
      allow write: if userCanWrite();
    }
  }
}

Here is my database structure

P.S。

我从官方文件中尝试了另一条规则 get(/databases/{database}/documents/users/$(request.auth.uid‌​)).data.isAdmin == true;

这也不起作用

更新:正确的做法

支持帮助我找到了解决方案 这就是你应该做的:

db结构:

  

用户 - > {{userid}} - > {role:“admin”}

数据库规则设置:

  

get(usersPath / $(request.auth.uid))。role ==“admin”|| get(usersPath / $(request.auth.uid))。data.role ==“admin”;

5 个答案:

答案 0 :(得分:12)

我联系了Firebase支持部门报告该错误,他们给了我一个临时解决方案。看起来他们在安全规则方面的系统中存在错误。他们说文档没问题,但是现在我们应该这样解决:

get(path).data.field == true || get(path).field == true;

因为错误是未填充数据对象,所以应检查这两个属性。没有ETA来推出这个bug的解决方案,所以我问他们是否可以在他们解决这个问题时给我一个建议,所以我会将这个答案与他们的信息保持同步。

答案 1 :(得分:4)

所以我解决它的方式是我创建了另一个Collection被调用admins

然后我刚刚添加了我需要的用户的uid -  这是我的数据库结构 - https://i.imgur.com/RFxrKYT.png

这是规则

service cloud.firestore {
  match /databases/{database}/documents {

    function isAdmin() {
      return exists(/databases/$(database)/documents/admins/$(request.auth.uid));
    }

    match /tasks/{anyTask} {
    allow read: if request.auth != null;
      allow create: if request.auth != null;
      allow update: if request.auth != null && isAdmin();
      allow delete: if request.auth != null && isAdmin();
    }
  }
}

您可以在此处查看我的完整开源项目: https://github.com/metaburn/doocrate

答案 2 :(得分:1)

您应该在代码中使用$(database)代替{database}

get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";

答案 3 :(得分:0)

对我有用的是将userCanWrite函数移到我的规则之上。似乎必须在调用任何match规则之前定义该函数。疯狂:-)

答案 4 :(得分:0)

这是我用来检查用户是否为管理员的Firestore规则。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {


match /{document=**} {
  allow read: if true;
  allow write: if userIsAdmin();
}


function userIsAdmin() {
    return getUserData().userRole == 'Admin';
}

function getUserData() {
    return get(/databases/$(database)/documents/User/$(request.auth.uid)).data;
}

  }
}