firebase - 使用 get() 对 Firestore 安全规则缺少权限或权限不足
问题描述
几乎无论我对 get() 请求使用什么,Missing or insufficent permissions
在使用作为“成员”的用户 ID 登录时都会获取:
function isSelf(userID) {
return request.auth != null && request.auth.uid != null && request.auth.uid == userID
}
function isMember(userID) {
return request.auth != null && request.auth.uid != null && get(/databases/$(database)/documents/'members'/$(request.auth.uid)).data.parent == userID
}
match /templates/{userID} {
allow read, write: if false
match /templates/{templateID} {
allow read: if isSelf(userID) || isMember(userID)
allow write: if isSelf(userID)
allow delete: if false
}
allow read: if isSelf(userID) || isMember(userID)
allow write: if isSelf(userID)
}
已尝试将 get() 与.data.parent
和 一起.parent
使用 成员文档如下所示:
{
parent: 'USER_ID_OF_PARENT'
}
来自客户端应用程序的调用是:
export const getTemplate = async ({ userID, form }) => {
db.collection('templates').doc(userID).collection('templates').doc(form).get()
.then((doc) => {
})
.catch((err) => {
console.error(err)
})
}
数据库结构为:
- /templates/{userID}是 id 为 userID 的文档集合,对应于具有匹配 userID 的文档
/users/{userID}
- /members/{memberID}是 ids 作为 memberIDs 的文档的集合,其
parent
字段的字符串值SOME_USER_ID
与具有 userID 的文档SOME_USER_ID
匹配/users/{userID}
例子:
/members/'MEMBER_1'
文档:
{
name: 'Member 1',
parent: 'OWNING_USER_1'
}
/users/'OWNING_USER_1'
文档:
{
name: 'Owning User 1',
parent: 'OWNING_USER_1'
}
/templates/'OWNING_USER_1'
文档:
{
// no fields
}
/templates/'OWNING_USER_1'/templates/'FORM_1'
文档:
{
name: 'Form 1'
}
通过以下调用:
getTemplate({
userID: 'OWNING_USER_1',
form: 'FORM_1'
})
- 当认证用户为OWNING_USER_1时,上述调用成功(
isSelf()
规则返回true),返回找到的模板文档 - 当认证用户为MEMBER_1时,上述调用gets
Missing or insufficient permissions
(isMember()
规则返回false)
解决方案
删除了“成员”周围的引号,现在可以正常工作:
替换:
get(/databases/$(database)/documents/'members'/$(request.auth.uid)).data.parent
和:
get(/databases/$(database)/documents/members/$(request.auth.uid)).data.parent
推荐阅读
- azure - 使用 Add-AzServiceFabricClusterCertificate 时,未将对象引用设置为对象错误的实例是什么意思?
- regex - 如果前一行不以星号开头,则正则表达式替换行首的星号
- r - K 表示 R 中的聚类函数
- linux - 如何找到实际的 DNS TTL 值
- android - 如何在 Android Studio 中按名称搜索文件
- list - Java 中的 BlockingDeque 是什么?
- javascript - 通过 Link 将 Container 中的 props 和 fetch 传递给一个元素
- sql - pyodbc 似乎不处理来自 ORACLE DB 的 CASE 语句
- tensorflow.js - Typescript 和 Tensorflow.js 模型
- javascript - Ant Design:单击折叠标题时如何防止扩展,但允许按钮?