【问题标题】:How to have some data of a firebase document editable only by user with "admin" status?如何让 Firebase 文档的某些数据只能由具有“管理员”状态的用户编辑?
【发布时间】:2021-10-26 05:27:39
【问题描述】:

在我的 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”角色的人更新角色对象?然后其他信息应该只能由相关用户编辑(我知道这样做)

【问题讨论】:

  • @Dharmaraj 不是真的,因为我需要“Luigi”可以编辑其个人资料,除了只能由具有管理员角色的人更改的角色部分。我不确定我是否可以为部分文档制定规则

标签: angular firebase google-cloud-firestore firebase-security


【解决方案1】:

您可以使用request.resource 对象检查哪些字段正在更新,如果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 密钥未更新,则允许用户更新文档。

您可以在文档的prevent some fields from being changed 部分阅读有关hasAny() 的更多信息。

【讨论】:

  • 我不知道affectedKeys,似乎是一个不错的解决方案。我们终于改变了一点我们的角色结构,但这似乎是一个不错的方法。
猜你喜欢
  • 2023-04-04
  • 2019-12-31
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2021-01-02
  • 1970-01-01
相关资源
最近更新 更多