我对Firebase还是比较陌生,并且一直在使用它将Firestore和身份验证与我正在使用的ReactJS应用集成。
我知道集合包含文档,而文档实际上包含键值对。我收集了一些歌曲,并且其中包含以下字段:-
创建的时间戳记
歌词
歌曲标题
我能够使用Firebase身份验证登录的用户在登录并创建新歌曲时获得该用户的UID,并以文档ID作为UID进入数据库。
仅当我将规则设置为
时,所有这些方法才有效match /{document=**} {allow read, write:}
当我将规则更改为此时:-
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /songs/{songID} {
allow read: if request.auth!=null;
allow write: if isValid();
}
function isValid(){
return request.resource.data.uid == request.auth.uid;
}}}
运行时出现以下错误。
Unhandled Rejection (FirebaseError): Missing or insufficient permissions.
我只想确保已登录的用户可以阅读,编写和更新他/她自己的歌曲,除此之外,别无其他。
1)我无法理解如何构建Firebase规则以实现此目的并防止权限错误。
2)如果我将文档ID用作UID,即5首歌曲的文档ID相同。由于特定用户的文档ID相同,我如何才能更新歌曲中的歌曲标题/歌词?
答案 0 :(得分:1)
我无法理解如何构建Firebase规则以实现 这样可以防止权限错误。
以下规则可以解决问题:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /songs/{songID} {
allow read: if request.auth.uid == resource.data.uid;
allow write: if isValid();
}
function isValid(){
return request.resource.data.uid == request.auth.uid;
}
}
}
我建议您观看嵌入在此文档页面中的非常清晰的视频:https://firebase.google.com/docs/firestore/security/get-started?authuser=0
如果我将文档ID用作UID,即 5首歌。我将如何更新歌曲标题/歌词 歌曲,因为特定用户的文档ID是否相同?
您不能对不同的Firestore文档使用相同的文档ID。根据定义,文档ID必须是唯一的。最好的办法是让Firestore生成文档ID(例如,使用add()
方法),然后像您已经做过的那样在文档中添加作者uid
(因为您已经request.resource.data.uid
)。
然后,您可以构造查询以过滤与用户uid
相对应的文档。例如:
var user = firebase.auth().currentUser;
var songsRef = db.collection("songs");
var mySongsQuery = songsRef.where("uid", "==", user.uid);