javascript - CRUD 操作 React 的 Firestore 安全规则
问题描述
我对 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 相同,我如何能够更新歌曲中的歌曲标题/歌词?
解决方案
我无法理解如何构建 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。由于特定用户的文档 ID 相同,我如何能够更新歌曲中的歌曲标题/歌词?
您不能对不同的 Firestore 文档使用相同的文档 ID。根据定义,文档 ID 必须是唯一的。最好的办法是让 Firestore 生成一个 Document ID(例如使用add()
方法)并在文档中添加 author uid
,就像您已经完成的那样(因为您这样做了request.resource.data.uid
)。
然后,您可以构建过滤与 user 对应的文档的查询uid
。例如:
var user = firebase.auth().currentUser;
var songsRef = db.collection("songs");
var mySongsQuery = songsRef.where("uid", "==", user.uid);
推荐阅读
- r - 如何在 corroplot-R 中更改图例的字体类型
- python - 多线程和输入输出队列
- json - 使用 Kafka Streams 修改嵌套的 JSON 字段
- java - 如何在 textArea 中获取输入数据
- javascript - 匹配器错误:接收到的值必须是模拟或间谍函数 - 值未定义
- python - 如何在不破坏规范化的情况下堆叠数据
- firebase - 如何修复错误:无法将参数类型“void Function(String, int)”分配给参数类型“void Function(String, int?)”,因为“int?”
- html - Django Crispy Form &
- data-visualization - 如何通过单击echarts中数据点以外的其他位置来选择折线图?
- python - 即使系统休眠,Python 程序仍应运行 [Uuntu]