Firebase数据库规则-基于自定义声明的规则
我有一个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':
admin
和common
{
"admin" : {
"adminval" : 9898574632,
"adminval1" : 645354536,
"adminval2" : 7776756433
},
"common" : {
"commonval" : 123433221
}
}
我向每个用户添加了自定义声明角色
,该声明描述了用户在我的系统中的角色。看起来像这样
{'roles': ['ROLE_ADMIN', 'ROLE_USER']}
现在我想限制访问权限,这样只有具有claimROLE\u ADMIN
的用户才允许读/写ADMIN
节点,并且具有任意一个角色的用户都可以读/写nodecommon
怎么做?我试过类似的方法:
{
"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
- 但是在
节点中有一个OR,用于检查任一角色。这意味着不需要将用户角色赋予管理员common
- 请记住,自定义声明限制为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…
-处理这种情况的最佳方法是什么?