firebase - Firebase 数据库规则 - 基于自定义声明的规则
问题描述
我有一个 firebase 实时数据库。目前它包含两个节点admin
和common
{
"admin" : {
"adminval" : 9898574632,
"adminval1" : 645354536,
"adminval2" : 7776756433
},
"common" : {
"commonval" : 123433221
}
}
我向每个用户自定义声明添加了roles
描述用户在我的系统中的角色。看起来像这样
{'roles': ['ROLE_ADMIN', 'ROLE_USER']}
现在我想限制访问,因此只有具有声明ROLE_ADMIN
的用户才被允许读/写admin
node 并且任何一个角色都可以读/写 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')"
}
}
}
解决方案
恐怕我们不能在实时数据库安全规则中使用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.List。in
推荐阅读
- c# - FTP、SFTP 或套接字
- php - 使用 HTML 和 PHP 生成 MPDF 到 PDF
- java - 为互斥请求参数设计 API 的更好方法是什么?
- polymorphism - 在 ocaml 中定义多态中缀运算符
- xcode - Xcode 10.1 在编译时冻结
- android - 微调器值未存储在 firebase 数据库中
- c++ - 变量没有改变?通过向量的函数调用
- syntax-highlighting - 使用特定版本的atoms语言包
- python - 使用python调用antiword将doc转为txt,发现返回值是乱码
- php - VPS:切换了 PHP 版本但仍然无法安装 symfony4