我有以下Firestore数据库(简化版)
groups
group1
role=guest
group2
role=user
group3
role=moderator
users
user1
group=group1
user2
group=group2
items
item1
item2
假设我只允许用户读取/items
数据。
这是我的方法:
service cloud.firestore {
match /databases/{database}/documents {
function getUser(id) {
return get(/databases/$(database)/documents/users/$(id)).data
}
function getGroup(id) {
return get(/databases/$(database)/documents/groups/$(id)).data
}
function getRole(id) {
return get(/databases/$(database)/documents/roles/$(id)).data
}
match /items/{document=**} {
allow read: if getRole(getGroup(getUser(request.auth.id).group).role) == 'user'
}
}
}
但是它似乎不起作用。
看来不可能在Firestore规则中进行嵌套调用。
我用硬编码ID测试了getGroup()
,它工作正常:
allow read: if getGroup('<userGroupId>') == 'user'
这也有效:
allow read: if getUser(request.auth.uid).group == '<userGroupId>'
但是在这个更复杂的规则上失败了:
allow read: if getGroup(getUser(request.auth.uid).group) == 'user'
是否有可能使其工作? 如果没有,还有另一种方法吗?