首页 > 解决方案 > Firebase 数据库规则 - 基于自定义声明的规则

问题描述

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

{
  "admin" : {
    "adminval" : 9898574632,
    "adminval1" : 645354536,
    "adminval2" : 7776756433
  },
  "common" : {
    "commonval" : 123433221
  }
}

我向每个用户自定义声明添加了roles描述用户在我的系统中的角色。看起来像这样

{'roles': ['ROLE_ADMIN', 'ROLE_USER']}

现在我想限制访问,因此只有具有声明ROLE_ADMIN的用户才被允许读/写adminnode 并且任何一个角色都可以读/写 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')"
       }
    }
  }

标签: firebasefirebase-realtime-databasefirebase-authenticationfirebase-security

解决方案


恐怕我们不能在实时数据库安全规则中使用Array或。List规则语言只能用于有限的类型集。您可以在此处查看文档https://firebase.google.com/docs/reference/security/database

例如,我们可以通过在声明中使用来绕过这个限制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 安全规则中使用List和运算符,请参阅此处的文档https://firebase.google.com/docs/reference/rules/rules.Listin


推荐阅读