繁体   English   中英

如何检查firestore安全规则列表请求中是否存在文档?

[英]How to check if document exists in firestore security rules list request?

我有两个根 collections、 usersworkspaces 用户文档有一个工作区数组,其中包含用户所属的工作区文档 ID。 以下是我尝试使用的安全规则。 我有两种方法,一种是从根集合中获取用户文档并检查其工作区数组中的 workspaceId,另一种是检查成员子集合中是否存在 userId。 两者最终都抛出相同的错误: FirebaseError: Null value error. for 'list' @ L15 FirebaseError: Null value error. for 'list' @ L15如果我将允许读取分为允许获取和允许列表,并且只为列表写入 true,它会修复错误,但显然我想限制访问,因此用户只能获得自己的工作区(他们是成员) .

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /workspaces/{workspaceId} {
      allow read: if isLoggedIn() && userIsInWorkspace(workspaceId);
    }

    function isLoggedIn() {
      return request.auth != null && request.auth.uid != null;
    }

    function userIsInWorkspace(workspaceId) {
      return exists(/databases/$(database)/documents/workspaces/$(workspaceId)/members/$(request.auth.uid));
    }
  }
}

获取方法:

function userIsInWorkspace(workspaceId) {
      let workspacesOfUser = get(/databases/$(database)/documents/users/$(request.auth.uid)).data.workspaces;
      return workspaceId in workspacesOfUser;
    }

更新:

我尝试使用这样的自定义声明来实现它:

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {

    match /users/{userId} {
      allow read: if isLoggedIn() && request.auth.uid == userId;
    }

    match /workspaces/{workspaceId}/{document=**} {
      allow read, write: if isLoggedIn() && userIsInWorkspace(workspaceId);
    }

    function isLoggedIn() {
      return request.auth != null && request.auth.uid != null;
    }

    function userIsInWorkspace(workspaceId) {
      return workspaceId in request.auth.token.workspaces;
    }
  }
}

所以我的概念是我有usersworkspaces作为根集合, workspaces有子集合,如teamsreports等。 我仍然得到相同的null value error 当出现上述错误时, list请求会出现错误。 我的用例是,当您从应用程序中注销时,存储在 firestore 中每个工作区条目上的工作区 slug 都会添加一个查询参数,以便用户可以被重定向回确切的工作区。 为了实现这一点,我做了一个列表请求,所以基本上我查询了工作区集合,其中 slug 是来自 url 的给定 slug。

const workspaceSnapshot = await db
          .collection('workspaces')
          .where('slug', '==', this.$route.query.slug)
          .limit(1)
          .get()

这个请求造成了我的错误,但我无法从中找出任何东西。 我想当我给出一个包括getlist的读写条件时。

查询区分大小写。 您说您有两个根 collections,即UsersWorkspaces ,但是您正在查询usersworkspaces 这不会产生结果。 尝试更改您的查询:

function userIsInWorkspace(workspaceId) {
      let workspacesOfUser = get(/databases/$(database)/documents/Users/$(request.auth.uid)).data.workspaces;
      return workspaceId in workspacesOfUser;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM