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

Firestore security rule get() not work

解决方案在post的最后。看看吧。

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

只是一个简单的问题:这有什么问题以及为什么它不起作用?

尝试通过在用户部分具有 'admin' 角色的用户访问 /titles/{anyTitle} 但仍然获得

Missing or insufficient permissions.

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;

这也行不通

更新:正确的方法

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

数据库结构:

users -> {{ userid }} -> { role: "admin" }

数据库规则设置:

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

所以我解决它的方法是我创建了另一个 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

我联系了 Firebase 支持人员报告该错误,他们为我提供了一个临时解决方案。似乎他们的系统在安全规则方面存在错误。他们说文档没问题,但现在我们应该这样解决:

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

因为错误是数据对象没有被填充,所以你应该检查这两个属性。没有针对此错误启动解决方案的 ETA,所以我问他们在解决此问题后是否可以给我建议,因此我会根据他们的信息及时更新此答案。

您应该在代码中使用 $(database) 而不是 {database}

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

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

这是我用来检查用户是否为管理员的 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;
}

  }
}