cho*_*Bao 2 firebase firebase-security google-cloud-firestore
似乎无法使用 Firestore 安全规则 .hasAny()。此方法是否已弃用或不再可用?
我正在使用它
/// Functions - NOT WORKING!!! ///
function isTeamMember(teamId, userId) {
return get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId].hasAny(['OWNER', 'ADMIN', 'STANDARD'])
}
Run Code Online (Sandbox Code Playgroud)
Firestore 数据的结构是这样的
- team_access_privilege (COLLECTION)
-- teamId (DOCUMENT)
--- userId1 (KEY) : 'OWNER' (VALUE)
--- userId2 (KEY) : 'ADMIN' (VALUE)
--- userId3 (KEY) : 'ADMIN' (VALUE)
--- userId4 (KEY) : 'STANDARD' (VALUE)
Run Code Online (Sandbox Code Playgroud)
这个团队有 4 个用户。
我还测试了以下功能并且它们运行良好。
/// Functions - Working Well ///
function isOwnerOfTeam(teamId, userId) {
return get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId] == 'OWNER'
}
Run Code Online (Sandbox Code Playgroud)
我的目标是检查只要在 team_access_privilege 中存在 userId,他/她就可以访问数据。我尝试使用exists()但模拟器需要永远运行。我放弃使用exists()。我不确定这是否是一个已知问题。
下面这需要永远运行
/// Functions - Not working too ///
function isTeamMember(teamId, userId) {
return exists(get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId])
}
Run Code Online (Sandbox Code Playgroud)
总而言之,我的目标是检查用户是否是读取/写入数据的团队的“所有者”、“管理员”或“标准”。
编辑 1
尝试了@Doug Stevenson 的回答,但它不起作用
['OWNER', 'ADMIN', 'STANDARD'].hasAny([get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId]])
Run Code Online (Sandbox Code Playgroud)
我尝试了另一种方法,它奏效了。
/// 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)
}
Run Code Online (Sandbox Code Playgroud)
['', '', ''].hasAny( get() ) 不起作用。get().hasAny(['', '', '']) 也是如此。Exists 不适用于我所说的数据结构。
这只是令人费解。无论如何,我现在有一个有效的安全规则。希望@Doug Stevenson 可以帮助找出一种更有效的方法来检查用户是否是读取/写入数据的团队的“所有者”、“管理员”或“标准”。
hasAny是一种关于数组类型的方法,如规则参考中所述。您可以使用它来确定列表类型字段是否包含给定列表中的任何值。您似乎正在尝试在字符串上使用它。
也许您可以在相反的方向使用它来确定用户 id 的字符串角色是否是给定的其他三个角色之一:
['OWNER', 'ADMIN', 'STANDARD'].hasAny([get(/databases/$(database)/documents/team_access_privilege/$(teamId)).data[userId]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2182 次 |
| 最近记录: |