首页 > 解决方案 > 如何计算/计算 get() 嵌套 get() 的 Firestore 安全规则访问限制?

问题描述

单文档请求和查询请求的 get() 限制为 10 个。对于“标准”的访问角色,以下代码段将有多少次访问调用?

function isOwnerOfTeam(teamId, userId) {
  return get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId] == 'OWNER'
}

function isAdminOfTeam(teamId, userId) {
  return get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId] == 'ADMIN'
}

function isStandardOfTeam(teamId, userId) {
  return get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId] == 'STANDARD'
}

function isTeamMember(teamId, userId) {
  return isOwnerOfTeam(teamId, userId) || isAdminOfTeam(teamId, userId) || isStandardOfTeam(teamId, userId)
}

如果我有一个带有 OR 运算符的 get() 嵌套 get() 怎么办。那将是多少访问呼叫?

例如

function getTeamId(teamName) {
  get(/databases/$(database)/documents/team/$(teamName)).data[id]
}

match /teamSecretStory/{teamName} {
      allow read: if isTeamMember(getTeamId(teamName), request.auth.uid);
}

总而言之,这个 get() 嵌套 get() 与角色“标准”的 OR 运算符有多少访问权限?

标签: firebasegoogle-cloud-firestore

解决方案


像所有主要的编程语言一样,安全规则将它们的逻辑 OR 从左到右短路。从左到右对每个 OR 进行评估,直到其中一个评估为真,或所有 OR 评估为真。与逻辑与相同,除了第一次错误评估将停止整个电路。


推荐阅读