Firestore数据库规则在模拟器中有效,但在应用程序中无效

时间:2019-05-29 12:48:17

标签: firebase react-native google-cloud-firestore firebase-security-rules

我正在构建一个React Native应用程序,并且刚刚开始构建我的Firestore数据库中的所有安全规则。我有几个很好的规则,但是有一个规则与给我的工作规则几乎相同 Error: Missing or insufficient permissions. 甚至更奇怪的是,当我在Firestore模拟器中测试此规则时,该规则通过了,没有任何问题。

我尝试将所有条件逻辑从函数推入规则本身,但是什么也没做。

以下是相关规则:

service cloud.firestore {
  match /databases/{database}/documents {
    function getCurrentTeam() {
        return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.lastTeam;
    }

    function signedIntoTeam() {
      // For context, all "like" documents have an associated teamId.
      return request.auth.uid != null && getCurrentTeam() == resource.data.teamId;
    }

    match /likes/{like} {
      allow read: if signedIntoTeam();
    }

  }
}

这是我的React Native应用中的错误函数:

const getLikes = posts =>
    new Promise((resolve, reject) => {
        const likedPosts = [];
        if (!posts.length) return resolve(likedPosts);
        posts.forEach(post => {
            if (post.likeCount > 0) {
                firebase
                    .firestore()
                    .collection('likes')
                    .where('postId', '==', post.id)
                    .where('userId', '==', firebase.auth().currentUser.uid)
                    .get()
                    .then(querySnapshot => {
                        const likedByUser = querySnapshot.size > 0;
                        likedPosts.push({ ...post, likedByUser });
                        if (likedPosts.length === posts.length) resolve(likedPosts);
                    })
                    .catch(err => reject(err));
            } else {
                likedPosts.push({ ...post, likedByUser: false });
                if (likedPosts.length === posts.length) resolve(likedPosts);
            }
        });
    });

我有非常相似的功能和规则,可以在其他地方正常工作。我似乎无法弄清楚为什么这个特别失败了。

1 个答案:

答案 0 :(得分:0)

您的规则正在尝试根据文档B字段的内容从D -> A -> B -> A 集合中筛选文档。如果您的查询也没有使用相同的条件进行过滤,则该规则将始终拒绝该请求。这是因为 security rules are not filters 。请阅读链接的文档。

有了适当的规则,客户端总是必须在likes字段上进行过滤。目前,它只是在teamIdteamId上进行过滤。您应该在其中添加postId,或更改规则以匹配查询。查询和规则需要同步-查询只能请求知道规则可读取的文档-它不应依赖规则对结果集进行更改。< / p>