Firebase数据库规则-基于自定义声明的规则

Firebase数据库规则-基于自定义声明的规则,firebase,firebase-realtime-database,firebase-authentication,firebase-security,Firebase,Firebase Realtime Database,Firebase Authentication,Firebase Security,我有一个firebase实时数据库。目前它包含两个节点admin和common { "admin" : { "adminval" : 9898574632, "adminval1" : 645354536, "adminval2" : 7776756433 }, "common" : { "commonval" : 123433221 } } 我向每个用户添加了自定义声明角色,该声明描述了用户在我的系统中的角色。看起来像这样 {'roles':

我有一个firebase实时数据库。目前它包含两个节点
admin
common

{
  "admin" : {
    "adminval" : 9898574632,
    "adminval1" : 645354536,
    "adminval2" : 7776756433
  },
  "common" : {
    "commonval" : 123433221
  }
}
我向每个用户添加了自定义声明
角色
,该声明描述了用户在我的系统中的角色。看起来像这样

{'roles': ['ROLE_ADMIN', 'ROLE_USER']}
现在我想限制访问权限,这样只有具有claim
ROLE\u ADMIN
的用户才允许读/写
ADMIN
节点,并且具有任意一个角色的用户都可以读/写node
common

怎么做?我试过类似的方法:

{
    "rules": {
       "admin": {
           ".read": "auth.token.roles.contains('ROLE_ADMIN')",
           ".write": "auth.token.roles.contains('ROLE_ADMIN')"
       }
       "common": {
           ".read": "auth.token.roles.contains('ROLE_USER') || auth.token.rules.contains('ROLE_ADMIN')",
           ".write": "auth.token.roles.contains('ROLE_USER') || auth.token.rules.contains('ROLE_ADMIN')"
       }
    }
  }

我从未在自定义声明中使用过数组,所以我不确定它是如何工作的,或者为什么它不适合您

但我确实注意到,您在规则中混合使用了基于角色的访问控制和基于级别的访问控制,所以我想给出一些一般性提示/观察:

  • 您正在用两个角色标记管理员:
    ROLE\u ADMIN
    ROLE\u USER
  • 但是在
    common
    节点中有一个OR,用于检查任一角色。这意味着不需要将用户角色赋予管理员
  • 请记住,自定义声明限制为1000字节,并随每个请求一起发送。我强烈建议删除
    角色
    前缀,因为这已经隐含在声明的
    角色
    名称中
  • <> LI>如果你有一个通用逻辑,管理员可以看到比普通用户更多的信息,请考虑使用数字<代码> Access级别< /代码>声明。假设普通用户是
    级别:1
    ,而管理员是
    级别:2
    。然后,您可以在声明中检查最低级别:
    。.read:“auth.token.access\u level>=1”

      恐怕我们不能在实时数据库安全规则中使用
      数组
      列表
      。规则语言只能处理有限的类型集。您可以在这里查看文档

      我们可以绕过这一限制,例如在权利要求中使用
      String

      {'roles': 'ROLE_ADMIN,ROLE_USER'}
      
      现在,我们可以使用

      ".read": "auth.token.roles.contains('ROLE_USER') || auth.token.rules.contains('ROLE_ADMIN')"
      
      ,因为
      String
      支持
      contains
      方法。另一个选择,正如你在评论中所建议的,是设置如下声明

      {'role_admin': true, 'role_user': true}
      
      然后检查规则中的角色

      ".read": "auth.token.role_admin == true || auth.token.role_user == true"
      

      旁注:我们可以在Firestore安全规则中使用
      列表
      中的
      运算符,请参见此处的文档。

      感谢您的观点,我会考虑它们-无论如何,我问题中的示例只是一些抽象情况-真正的问题是:我可以在自定义声明中使用数组吗?为什么
      contains
      方法不起作用?我希望具有基于角色的访问权限,并且一个用户可以有多个角色,我希望避免对每个角色进行声明,例如
      {panelAdmin:true,otherPanelAdmin:false…
      -处理这种情况的最佳方法是什么?