相关疑难解决方法(0)

基于映射值的Firestore安全规则

如果允许用户根据用户的电子邮件地址阅读文档中的文档,我想存储.多个用户应该可以访问同一文档.

根据文档, Firestore不允许查询数组成员.这就是为什么我将用户电子邮件地址存储在String-Bool Map中,并将电子邮件地址作为密钥.

对于以下示例,我没有使用电子邮件作为映射键,因为它已经不能使用基本字符串.

数据库结构如下所示:

lists
  list_1
    id: String
    name: String
    owner: E-Mail
    type: String
    shared:
      test: true
Run Code Online (Sandbox Code Playgroud)

此处列出了所有安全规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /lists/{listId=**} {
        allow read: if resource.data.shared.test == true
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果我使用match /lists/{listId}而不是,它也不起作用match /lists/{listId=**}

我理解的是,如果地图中的shared[test]值为true ,则此安全规则应允许对每个人进行读取访问.

为了完整起见:这是我正在使用的查询(Android上的Kotlin):

collection.whereEqualTo("shared.test", true).get()
        .addOnCompleteListener(activity, { task ->
            if (task.isSuccessful) {
                Log.i("FIRESTORE", "Query was successful")
            } else {
                Log.e("FIRESTORE", "Failed to query existing from Firestore. Error ${task.exception}")
            }
        })
Run Code Online (Sandbox Code Playgroud)

我猜我无法访问安全规则中的地图值.那么什么是我的问题的替代解决方案?

Firestore规则参考中 …

firebase firebase-security google-cloud-firestore

13
推荐指数
1
解决办法
3100
查看次数

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

解决方案是在帖子的最后.看看这个.

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

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

尝试与用户部分中具有"admin"角色的用户访问/ titles/{anyTitle},但仍然可以访问

权限丢失或不足.

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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的数据库结构

PS

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

这也不行

更新:正确的做法

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

数据库结构:

用户 - > {{userid}} - > {role:"admin"}

数据库规则设置:

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

firebase firebase-security google-cloud-firestore

11
推荐指数
3
解决办法
4834
查看次数