Firebase 云Firestore安全规则-访问对象数组中的属性

Firebase 云Firestore安全规则-访问对象数组中的属性,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,是否可以访问对象数组中包含的文档属性值 我一直在研究一个优秀的应用程序,其中使用文档密钥来满足访问要求。下面是一个例子: 简单用户文档 name: 'a user', roles: { admin: true, editor: true } name: 'a user', roles:[ { feature: 'feature 1', role: 'admin' }, { feature: 'feature 2', role: 'editor

是否可以访问对象数组中包含的文档属性值

我一直在研究一个优秀的应用程序,其中使用文档密钥来满足访问要求。下面是一个例子:

简单用户文档

name: 'a user',
roles: {
  admin: true,
  editor: true
}
name: 'a user',
roles:[
  {
    feature: 'feature 1',
    role: 'admin'
  },
  {
    feature: 'feature 2',
    role: 'editor'
  }
]
安全规则

service cloud.firestore {
  match /databases/{database}/documents {
      function getUserData() {
        return get(/databases/$(database)/documents/accounts/$(request.auth.uid)).data
      }
      function userHasRole(role) {
        return getUserData().roles[role] == true;
      }
      match /<some_path>/ {
        allow read, write: if userHasRole(editor);

    }
  }
}

如果我的用户文档的结构是这样的,那么是否可以在安全规则中访问给定功能的“角色”值

我认为你构建角色的方式与你期望的结果背道而驰。您确实希望用户文档上的
roles
字段按用户可能拥有的所有角色的键名进行索引,这与您展示的第一个示例更为相似,这使得查找用户是否拥有角色变得容易


按照现在的方式,规则必须能够1)迭代所有角色,然后2)检查每个迭代对象是否有一个与所需匹配的
role
字段值。安全规则不够灵活,无法表达这种逻辑。

我认为您构建角色的方式不符合您的预期结果。您确实希望用户文档上的
roles
字段按用户可能拥有的所有角色的键名进行索引,这与您展示的第一个示例更为相似,这使得查找用户是否拥有角色变得容易

按照现在的方式,规则必须能够1)迭代所有角色,然后2)检查每个迭代对象是否有一个与所需匹配的
role
字段值。安全规则不够灵活,无法表达这种逻辑