Firebase 安全规则“列表为假”错误

时间:2021-03-13 13:34:14

标签: javascript google-cloud-firestore firebase-authentication firebase-security

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

我已经为它设置了以下规则:

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

访问级别基本上规定:

  • 如果您是超级管理员就可以访问
  • 如果您是管理员并且属于工作区,则可以访问(所有课程都在工作区下)
  • 如果您是编辑并且属于工作区,则可以访问
  • 如果您的 UID 在数组“canView”或“canEdit”中并且您属于工作区,则可以访问
  • 如果课程是公开访问并已发布,则可以访问。 (意思是未经身份验证的用户)

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

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);

0 个答案:

没有答案