【问题标题】:Is Firestore Security Rule .hasAny(['A', 'B', 'C']) still available for use?Firestore 安全规则 .hasAny(['A', 'B', 'C']) 是否仍然可用?
【发布时间】:2018-06-28 02:33:38
【问题描述】:

似乎无法使用 Firestore 安全规则 .hasAny()。此方法是否已弃用或不再可用?

我正在使用它

/// Functions - NOT WORKING!!! ///
function isTeamMember(teamId, userId) {
  return get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId].hasAny(['OWNER', 'ADMIN', 'STANDARD'])
}

Firestore 数据的结构是这样的

- team_access_privilege (COLLECTION)
-- teamId (DOCUMENT)
--- userId1 (KEY) : 'OWNER' (VALUE)
--- userId2 (KEY) : 'ADMIN' (VALUE)
--- userId3 (KEY) : 'ADMIN' (VALUE)
--- userId4 (KEY) : 'STANDARD' (VALUE)

这个团队有 4 个用户。

我还测试了以下功能,它们运行良好。

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

我的目标是检查只要 userId 存在于 team_access_privilege 他/她就可以访问数据。我尝试使用 exists() 但模拟器需要永远运行。我正在放弃使用 exists()。我不确定这是否是一个已知问题。

这需要永远运行

/// Functions - Not working too ///
    function isTeamMember(teamId, userId) {
      return exists(get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId])
    }

总而言之,我的目标是检查用户是否是团队的“所有者”、“管理员”或“标准”来读取/写入数据。


编辑 1

尝试了@Doug Stevenson 的回答,但它不起作用

['OWNER', 'ADMIN', 'STANDARD'].hasAny([get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId]])

这是错误信息。

我尝试了另一种方法,它奏效了。

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

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

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

/// Functions - Then This WOrks ///
    function isTeamMember(teamId, userId) {
      return isOwnerOfTeam(teamId, userId) || isAdminOfTeam(teamId, userId) || isStandardOfTeam(teamId, userId)
    }

['', '', ''].hasAny( get() ) 不起作用。 get().hasAny(['', '', '']) 也是如此。 Exists 不适用于我所说的数据结构。

这只是令人费解。无论如何,我现在有一个有效的安全规则。希望@Doug Stevenson 可以帮助找出一种更有效的方法来检查用户是否是团队的“所有者”、“管理员”或“标准”来读取/写入数据。

【问题讨论】:

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


    【解决方案1】:

    hasAny 是数组类型的方法,as documented here in the rules reference。您可以使用它来确定列表类型字段是否包含给定列表中的任何值。看来您正在尝试在字符串上使用它。

    或许你可以反方向使用它来判断用户id的字符串角色是否是给定的其他三个角色之一:

    ['OWNER', 'ADMIN', 'STANDARD'].hasAny([get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId]])
    

    【讨论】:

    • 使用exists(get())怎么样?或者简单地使用 exists() 这可能吗?
    • 顺便说一下你推荐的上述方法不起作用。另一个错误。运行模拟时出错 — 错误:simulator.rules 行 [65]、列 [45]。不支持的操作错误。收到:list.hasAny(string)。预期:list.hasAny(list)。
    • 您必须将 get() 放在方括号中才能使其成为列表。它可以编译,但我发现它没有按我预期的方式工作。
    • 我用编辑 1 更新了这个问题。它正在使用一种解决方法。但是无法让 .hasAny() 或 exists() 与我所说的数据结构一起工作。
    • 与此相关的问题。或许你知道答案stackoverflow.com/q/51074728/3073280
    猜你喜欢
    • 2020-07-08
    • 1970-01-01
    • 2018-10-19
    • 2019-07-05
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多