首页 > 解决方案 > Firebase 安全规则“列表为假”错误

问题描述

我有一个“课程”资源,允许不同级别的访问。

我为它设置了以下规则:

      allow read: 
      if
      isSuperAdmin() ||
      adminBelongsToWorkSpace(workspaceId) ||
      editorBelongsToWorkSpace(workspaceId) || 
      (canView(resource) || canEdit(resource)) && belongsToWorkspace(workspaceId) ||
      allCanView(resource) && belongsToWorkspace(workspaceId) ||
      isPublicAccess(resource) && isPublished(resource);

访问级别基本上规定:

我构建查询的方式是这样的:

const ref = firestore
    .collection('workspaces')
    .doc(workspaceId)
    .collection('courses');


let courses;
let data;

try {
    
    if (getAll) {
        data = await ref.get();
        
    } else {
        if (publicAccess) {
            ref.where('publicAccess', '==', true);
            ref.where('published', '==', true);
            
        }

        if (allCanView) {
            ref.where('published', '==', true);
            ref.where('allCanView', '==', true);
            
        }

        if (userId) {
            ref.where('published', '==', true);
            ref.where('allCanView', '==', true);
            ref.where('canView', 'array-contains', userId);
            ref.where('canEdit', 'array-contains', userId);
        
        }

        data = await ref.get();
    }

您可以看到,我查询的文档是以布尔值为条件的,例如 publicAccess、allCanView 和 UserId(字符串)。GetAll 布尔值用于编辑器/管理员/超级管理员尝试查询的情况,在这种情况下您将获得所有信息。

在控制台中我收到此错误,我不知道如何处理它:

FirebaseError: 
false for 'list' @ L103

L103 - 第 103 行,指向“isSuperAdmin()”,这个函数如下:

  function isSuperAdmin() {
    return isSignedIn() && request.auth.token.superadmin == true;
  }

更新:

我在规则操场上测试了规则,它们在获取数据方面工作得很好。所以我猜这是查询以及它们是如何构建的问题。

当用户不是管理员,只是一个用户,但在 canView/canEdit 数组中有他的 ID 时,就会发生错误。

但据我所知,这是正确的:

            ref.where('canView', 'array-contains', userId);
            ref.where('canEdit', 'array-contains', userId);

标签: javascriptgoogle-cloud-firestorefirebase-authenticationfirebase-security

解决方案


推荐阅读