Firebase规则可确保创建文档时的静态值

问题描述 投票:0回答:1

当我从客户端创建项目时,我想确保他们没有篡改planlimits

service cloud.firestore {
  function isSignedIn() {
    return request.auth != null;
  }

  match /databases/{database}/documents {
    match /projects/{projectId} {
      function hasRole(rsc, role) {
        return rsc.data.users[request.auth.uid].role == role;
      }

      function userExistsInProject(rsc) {
        return (request.auth.uid) in rsc.data.users;
      }

      function projectResource() {
        return get(/databases/$(database)/documents/projects/$(projectId));
      }

      function planIsStandard(rsc) {
        return rsc.data.plan == 'standard' && rsc.data.limits.nodes == 1;
      }

      allow create: if isSignedIn() && planIsStandard(resource);
      allow read: if isSignedIn() && userExistsInProject(resource);
      allow write: if isSignedIn() && hasRole(resource, 'owner');

      match /cluster/{clusterId} {
        allow create, write: if isSignedIn() && hasRole(projectResource(), 'owner');
        allow list, read: if isSignedIn() && userExistsInProject(projectResource());
      }
    }
  }
}

planIsStandard功能不起作用。如果我包含其中任何一个条件,则它不适用于以下内容:

await db.collection('projects').add({
  plan: 'standard',
  limits: {
    nodes: 1,
  },
  name,
  created: new Date(),
  owner: user.uid,
  users: {
    [user.uid]: true,
  },
});

如果我删除projectIsStandard检查我可以创建文档。

这似乎是一个正常的规则,我看不出我在这里做错了什么?谢谢。

firebase google-cloud-firestore firebase-security-rules
1个回答
0
投票

如果要检查传入文档的内容,则需要使用request.resource而不是resource。后者仅查看现有文档,如果存在的话。 request.resource查看新文件,或对其提出的修改建议。

因此,您的规则仅查看数据库中的现有文档,这些文档永远不会应用于新创建的文档。

© www.soinside.com 2019 - 2024. All rights reserved.