我制作了一个应用程序,用户可以在其中将记录发布到Firestore数据库中。现在,我正在实施安全规则,但是我正在努力寻找解决方案。
我的代码如下
docRef.get().then(function(doc){
if(doc.exists){
docRef.set(//data to set here)
} else {
docRef.update(//data to update here)
}
.catch((error) => {
alert('Error' + error);
})
我的规则当前设置为允许用户在获得授权的情况下创建对象,并且仅当记录中的用户ID与自己匹配时才允许更新。
service cloud.firestore {
match /databases/{database}/documents {
match /users/{user}{
allow create: if request.auth.uid != null;
allow read, write: if request.auth.uid == resource.id;
}
match /equipment/{document} {
allow create: if request.auth.uid != null;
allow read, update: if request.auth.uid == resource.data.user;
}
我认为问题出在我试图创建对象之前。但是,我需要在写入文档之前执行这些检查。 我认为这个问题正确吗?如果有的话,我可以实施一个解决方案。
谢谢
答案 0 :(得分:0)
我仍在制定规则,但我希望这会有所帮助。
如果您要确保用户正在编辑自己拥有的内容,并且他们的uid
与document id
相同。...
function isOwner(userId) {
return request.auth.uid == userId
}
match /users/{userId} { //this is the document
allow write: if isOwner(userId);
}
如果您要确保他们是文档的创建者:
match /equipment/{documentId} {
allow create: if request.auth.uid != null;
allow read, update: if get(/databases/$(database)/documents/equipment/documentId).data.userId == request.auth.uid;
}
https://firebase.google.com/docs/firestore/security/rules-conditions?authuser=0
您需要使用get函数来检索您感兴趣的文档。该函数返回的数据具有可以比较的相关字段,在这种情况下,无论您存储用户ID的字段名称是什么,您都可以将其与他们的auth.uid
进行比较。
答案 1 :(得分:0)
我认为您应该将“创建”规则更改如下:
allow create: if request.auth.uid != null &&
request.auth.uid == request.resource.data.id;
这是文档所说的:“如果您的规则集允许挂起写入,request.resource 变量包含文档的未来状态。”