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

标签: angularfirebasegoogle-cloud-firestorefirebase-security

解决方案


您可以使用request.resourceobject 检查哪些字段正在更新,并检查用户是否是管理员(如果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.


推荐阅读