FireBase数据库规则-基于自定义声明的规则 [英] Firebase Database Rules - rules based on custom claims

查看:16
本文介绍了FireBase数据库规则-基于自定义声明的规则的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Firebase实时数据库。当前包含两个节点admincommon

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

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

现在,我要限制访问,以便只允许具有声明ROLE_ADMIN的用户读/写admin节点,并且具有任一角色的用户都可以读/写节点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')"
       }
    }
  }

推荐答案

恐怕我们不能在实时数据库安全规则中使用ArrayList。规则语言只能与有限的类型集一起使用。您可以在这里查看文档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安全规则中使用Listin运算符,请参阅此处https://firebase.google.com/docs/reference/rules/rules.List

这篇关于FireBase数据库规则-基于自定义声明的规则的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆