firebase 当特定字段只能由某些用户更新时组合安全性规则

yuvru6vn  于 2023-03-03  发布在  其他
关注(0)|答案(1)|浏览(104)

我有一个issue文档,我想应用以下限制来更新它-
1.用户必须登录
1.用户可以是该问题的创建者,也可以是主持人
1.要更新status字段,用户必须是主持人
我可以执行前两条规则-

allow update: if (isLoggedIn() && (isCreator() || isModerator()));

但是我很难把第三条规则的逻辑和这个结合起来。
在前端,我可以根据当前用户是否是版主来显示/隐藏status字段。但是我如何在后端通过安全规则来强制执行这个限制呢?
我的规则是-

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  
  function isLoggedIn(){
    return request.auth != null;
  }
  
  function isCreator(rsc){
    return request.auth.uid == rsc.data.postedById;
  }
  
  function isModerator(){
    return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.moderator == true;
  }
  
  function isStatusField(rcs){
    return request.resource.data.diff(rcs.data).affectedKeys().hasAny(['status']);
  }
  
    match /issues/{issue} {
      allow read;
      allow create: if isLoggedIn();
      allow update: if (isLoggedIn() && (isCreator() || isModerator()));
    }
  }
}
zkure5ic

zkure5ic1#

我建议制定稍微不同的规则:
1.文档的主持人可以修改其中的任何字段。
1.单据的创建者可以修改除status以外的所有字段。
这就更清楚地表明,您需要在您的条件中更早地划分用户的角色,并可能导致类似以下的结果:

allow update: if (isLoggedIn() && (
  isModerator() || (
    isCreator() && !('status' in request.resource.data.diff(resource.data).affectedKeys())
  )
));

相关问题