我是一个新开发人员,正在开发我的第一个Firestore应用程序。为了使数据对用户更加安全,我已经更改了Firestore的规则,但是它不允许读/写。
这是关键线路,我不知道如何配置它,具体到我的应用-
match /some_collection/{userId}/{documents=**} {我不知道是将" some_collection“更改为集合名称,还是some_collection本身是一个实际的通配符类型。
另外,我是否需要以某种方式将userID从我的快速应用程序传递到Firestore?在这一行中,userID来自哪里?我更愿意制定这样的规则,即只有创建数据的用户才能读写。我相信这个块允许任何经过身份验证的用户,所以我只是尝试探索每一步。
service cloud.firestore {
match /databases/{database}/documents {
// Allow only authenticated content owners access
match /some_collection/{userId}/{documents=**} {
allow read, write: if request.auth != null && request.auth.uid == userId
}
}
}发布于 2021-01-05 16:34:20
回答你的问题:
这是关键线,我不知道如何配置它特定于我的应用程序。
match /some_collection/{userId}/{documents=**}我不知道是将" some_collection“更改为集合名称,还是some_collection本身是一个实际的通配符类型。
在上面的行中," some_collection“不是一个防火墙通配符,您需要用集合的实际值替换some_collection。
另外,我是否需要以某种方式将userID从我的快速应用程序传递到Firestore?
是的,预计在阅读或写信到或从消防站之前:
firebase.initializeApp({
apiKey: '### FIREBASE API KEY ###',
authDomain: '### FIREBASE AUTH DOMAIN ###',
projectId: '### CLOUD FIRESTORE PROJECT ID ###'
});firebase.auth().signInWithCustomToken(token)
.then((user) => {
// Signed in
// ...
})
.catch((error) => {
var errorCode = error.code;
var errorMessage = error.message;
// ...
});传递userId是在调用db时由firebase对象完成的。集合(“col123”).add或任何其他方法。如果你看一下已初始化是怎样的
var db = firebase.firestore();
您将看到它与firebase对象的依赖关系。
在这一行中,userID来自哪里?
userID来自firebase对象.
我相信这个块允许任何经过身份验证的用户,所以我只是尝试探索每一步。
是的,最后一条规则允许任何经过身份验证的用户从/写入子集合/文档通配符{userId}。
最后,我们还希望在您的防火墙文档或子集合的ids中存在一些命名一致性。
这意味着当您创建存储文档时,使用firebase.auth.uid作为文档id.。
否则,上述规则将失败,因为{userId}背后的值不等于日志记录用户的firebase.auth.uid。
要实现后者,您可以参考这个回答。
我强烈建议您看一看这个视频(从firebase通道),因为它更详细地阐述了防火墙安全规则的核心概念。
我希望你觉得这很有用。
https://stackoverflow.com/questions/65552537
复制相似问题