首页 > 解决方案 > 使用 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)
    })
}

数据库结构为:

例子:

/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'
})
  1. 当认证用户为OWNING_USER_1时,上述调用成功isSelf()规则返回true),返回找到的模板文档
  2. 当认证用户为MEMBER_1时,上述调用gets Missing or insufficient permissionsisMember()规则返回false)

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


删除了“成员”周围的引号,现在可以正常工作:

替换:

get(/databases/$(database)/documents/'members'/$(request.auth.uid)).data.parent

和:

get(/databases/$(database)/documents/members/$(request.auth.uid)).data.parent


推荐阅读