【问题标题】:Firestore rules - Why is adding an OR statement in a rule returning false when rule passes without the OR statement?Firestore 规则 - 为什么在没有 OR 语句的情况下通过规则时在返回 false 的规则中添加 OR 语句?
【发布时间】:2018-07-03 20:15:56
【问题描述】:

我有一个 Firestore 规则,直到我添加 OR 语句。不管右边是真是假,这不应该还是过去吗?

allow read: if exists(/databases/$(database)/documents/companies/$(company)/users/$(request.auth.uid)) 
|| hasRole(['Super', 'Manager', 'Tester']);

如果我省略了 || hasRole(['Super', 'Manager', 'Tester']);规则通过/允许数据访问。

这与函数有关还是我在 Firestore 规则中遗漏了 Or 语句?

function hasRole(roles) {
    return get(/databases/$(database)/documents/companies/Seva%20Development/users/$(request.auth.uid)).data.roles.hasAny(roles);
}

companies/company/users/userId 有许多字段,其中之一是角色。 Roles 是一个字符串数组(例如:["Admin"、"Manager"、"Tester"])。

【问题讨论】:

  • 请编辑您的问题以在您希望它检查的文档中显示data.roles 的数据类型和内容。

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


【解决方案1】:

我相信这是因为您没有在hasRole 中正确使用变量,并且应该在get 之后调用datahasRole 应该是:

function hasRole(roles) {
  return get(/databases/$(database)/documents/companies/$(company)/users/$(userId)).data.roles.hasAny(roles);
}

【讨论】:

  • 我试图省略路径变量以简化,但我已经更新了函数以使其保持原样,并且在调用 get 后对其进行了编辑以获取数据,但是它仍然拒绝许可。
  • 您提出什么类型的请求? get 还是 list?如果list,那么我认为您的规则不会起作用,因为 Firestore 强制执行的规则不会为结果集中的每个文档执行。 (即您的将不起作用,因为您在每个文档下嵌套了 users。)
  • 这是一个获取请求。我不在此应用程序中使用列表请求。甚至仔细检查了模拟器是否仅检查获取请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多