首页 > 解决方案 > Firebase FireStore 抽象功能不起作用

问题描述

我在 fireStore 中有一个有效的读取规则来检查用户是否在 /accounts/{account} 资源的 users 数组中:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    match /accounts/{account} {
       allow read: if request.auth != null && request.auth.token.email in resource.data.users;
    }

  }
}

为了简化代码并在其他地方使用函数来检查基于资源 ID 的用户访问,并遵循此链接中的信息:安全规则!| 了解 Cloud Firestore #6 19:25我曾尝试抽象代码:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

   function hasUserAccess(account){
    return request.auth.token.email in get(/databases/$(database)/documents/accounts/$(account)).data.users;
   }
   
   match /accounts/{account} {
    allow read: if request.auth != null && hasUserAccess(account);
   }

  }
}

这样当我想交叉引用相关文档的访问时,我可以调用该函数。为什么抽象版本无法工作?根据 youtube 视频,它似乎应该可以正常工作。

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


您将需要使用hasAny()检查帐户的用户列表是否包含传递的电子邮件。

另请注意,您必须在函数中传递request.auth.token.email 。

请使用以下代码查看用户是否存在于您的其他集合的“用户”字段中:


rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

   function hasUserAccess(account,email){
    return get(/databases/$(database)/documents/accounts/$(account)).data.users.hasAny([email]);
   }
   
   match /accounts/{account} {
    allow read: if request.auth != null && hasUserAccess(account, request.auth.token.email);
   }

  }
}


推荐阅读