angular - 如何让 Firebase 文档的某些数据只能由具有“管理员”状态的用户编辑?
问题描述
在我的 Angular 应用程序中,我使用 firestore 来存储我的用户的个人资料。目前我有这样的事情:
/profiles/{uid}/:
{
displayName: "Luigi",//--> Only editable by Luigi
email: "luigi@mario.com",
favoriteIceCream: "cookie dough",
roles: {//--> Not editable by Luigi, only by people with admin role
admin: true,
user: true
}
}
有没有办法将我的 Firestore 规则配置为只允许具有“admin=true”角色的人更新角色对象?然后其他信息应该只能由相关用户编辑(我知道这样做)
解决方案
您可以使用request.resource
object 检查哪些字段正在更新,并检查用户是否是管理员(如果roles
正在更新):
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function isAdmin() {
return get(/databases/$(database)/documents/profiles/$(request.auth.uid)).data.roles.admin == true;
}
match /profiles/{userId} {
allow update: if request.auth != null &&
((request.resource.data.diff(resource.data).affectedKeys().hasAny(['roles']) && isAdmin()) ||
((!request.resource.data.diff(resource.data).affectedKeys().hasAny(['roles']) && request.auth.uid == userId)));
}
}
}
如果roles
密钥正在更新,上述规则将检查用户是否为管理员,否则如果roles
密钥未更新,则允许用户更新文档。
You can read more about hasAny()
in prevent some fields from being changed section of the documentation.
推荐阅读
- windows - 如何访问 Windows Batch 中变量中的各个项目?
- python - 矩形在 Pygame 中不动
- python - 无法更改从 xslx 和 Pandas 读取的某些列的数据类型
- r - Rvest 抓取不同行数的谷歌新闻
- php - 如何清除 HTML 表单,甚至是表单的初始值?
- python - eval(parse()) 在 norvig 的 lispy.py 解释器的编辑版本中与 repl 的效果不同
- keras - 当我拟合模型时,如何在不使用历史记录的情况下绘制损失、val_loss 以及准确度、val_accuracy
- spring - Spring Framework 构建中使用了哪些测试装置,它们是如何使用的?
- haskell - 定义新的 monad 实例
- android - ConstraintLayout 2.0.4 layout_constraintHorizontal_chainStyle 有问题