将 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
)。
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
)。