将 UID 与文档字段匹配的 Firestore 规则不起作用

Firestore Rules matching UID with Document Field not working

Firebase 规则有点问题。

这是一个示例记录:

这是我的规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /question/{questionId}{
      allow read : if (request.auth.token.email_verified == true) &&
       (request.auth.uid == resource.data.quid);
    }
  }
}

这失败了:

FirebaseError: [code=permission-denied]: Missing or insufficient permissions

但是,当将 (request.auth.uid == resource.data.quid); 更改为 (request.auth.uid == 'gTEsGw3cUlaCswmVwpgdSzEd1TW2'); 时,它工作正常。我也可以很好地匹配电子邮件地址。只是不是 uid 到 quid 字段。

想法?

如果重要,这是我代码中的查询:

const showQuestions = () => {db.collection('question').where("email", "==", userObject.email).onSnapshot( data => {
        questions = data.docs;
    })
}

您的查询不符合您的规则。您的规则绝对要求用户只能查询其 UID 与文档的 quid 字段匹配的特定文档。但是,您的查询没有对 quid 字段提出任何要求。重要的是要知道 Firestore security rules are not filters,如果有任何可能匹配不满足所写规则的文档,他们将不允许查询。

为了让您的查询工作,它必须在符合规则要求的 quid 字段上指定一个过滤器。

db.collection('question')
    .where("email", "==", userObject.email)
    .where("quid", "==", uid)

其中 uid 是当前登录用户的 UID(例如 firebase.auth().currentUser.uid)。