Firebase FireStore 抽象函数不起作用

Firebase FireStore Abstracted function not working

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

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 检查用户访问权限,并遵循此 link 中的信息:Security Rules! | Get to know 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 视频,它似乎应该可以正常工作。

您将需要使用 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);
   }

  }
}

这行得通,我似乎无法在该函数正在检查的集合中使用该函数?

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

   // You can't use the function within this match condition
   match /accounts/{account} {
    allow read: if request.auth != null && request.auth.token.email in resource.data.users;
   }

   // You CAN use the function within this match condition as it isn't for the collection /accounts
   match /otherData/{account} {
     allow read: if request.auth != null && hasUserAccess(account)
   }
   

  }
}