javascript - Firestore 安全规则被拒绝
问题描述
我希望在编写安全规则时得到一些帮助。这很简单,但是我为消息规则编写的每个变体似乎都被拒绝了。我想说“仅当您是消息的发送者或接收者时才授予读/写访问权限”。
我想用这种安全性涵盖的基本规则:
- 用户不能编辑任何其他人的数据
- 用户可以与另一个人创建和阅读消息
- 如果未经身份验证,用户将无法访问任何数据
错误信息:
[未处理的承诺拒绝:FirebaseError:缺少权限或权限不足。]
到目前为止我所拥有的:
service cloud.firestore {
match /databases/{database}/documents {
function isLoggedIn() {
return request.auth != null && request.auth.uid != null;
}
function isSender() {
return resource != null && resource.data.user._id == request.auth.uid;
}
function isReceiver() {
return resource != null && request.auth.uid in resource.data.receiver
}
match /Users/{userId} {
//Only authenticated users can access/write data
allow delete: if request.auth.uid == userId;
allow read, write: if request.auth != null && request.auth.uid == userId;
}
match /messages/{messageId} {
// allow read, write: if isLoggedIn() && (isSender() || isReceiver());
allow read, write: if isLoggedIn() && (resource.data.user._id == request.auth.uid || request.auth.uid in resource.data.receiver);
}
}
}
消息数据结构如下:
id: ""
createdAt:""
index: 1
key: ""
receiver:
[0: receiverIDgoeshere]
message: ""
user:
{_id: ""}
询问:
let query = config.db
.collection(messages)
.where("key", "==", uid)
.orderBy("index", "desc");
if (typeof index === "number") {
query = query.where("index", ">", index);
}
const chats = await query.get();
还有一个传入消息的侦听器:
const listener = config.db
.collection(messages)
.where("key", "==", uid)
.where("receiver", "array-contains", userId)
.onSnapshot((snapshot) => {
const msgs = snapshot.docChanges().map(({doc, type}) => {
if (type === "added") {
return fixData({
id: doc.id,
match,
fromRealTime: true,
...doc.data(),
});
} else {
console.log("type is NOT added...");
}
return null;
});
setMessages(msgs.filter((msg) => msg !== null));
});
当我们添加聊天时:
const fs = config.db;
const doc = fs.collection(messages).doc();
await doc.set(chat);
解决方案
查询必须更新如下:
let query = config.db
.collection(messages)
.where("key", "==", uid)
.where("user._id", "==", uid)
.orderBy("index", "desc");
//rest is same
我没有看到听众的查询有任何问题。
推荐阅读
- json - 反应:用另一个文件中的 json 数据填充选择菜单
- json - Flutter 创建 API 请求并接收带有 - 'Ä' 'Ö' 'Ü' 'ß' 的字符串
- javascript - 使用 ASP.net Core 中的标签助手将图像上传为 b64 字符串
- angular - Rxjs 将 observable 中的值赋给全局变量
- android - 当我安装我的应用程序时,清单或某处是否有任何功能,它将出现在诸如浏览器应用程序之类的设备上?
- sql - 对 BigQuery 中的所有列应用函数
- ansible - ansible 中的 include_vars 和 vars 的用法是一样的吗
- json - 在 Terraform 中,是否可以将日志作为 json 获取?
- tensorflow - TensorFlow Dataset API 中的条件语句
- shell - 如何编写一个 unix shell 脚本来删除目录中的文件(1.f1,2.f2,)