match /UserProfile {
match /{uId}{
allow get: if isUserLoggedIn() && !isUserBlocked(uId);
}
当我尝试使用上述安全规则从UserProfile / {uId}获取数据时,它在Firestore中抛出以下错误,并在代码中显示权限不足:
Error running simulation — Error: simulator.rules line [199], column [28]. Function not found error: Name: [get].
现在上面两个函数的定义在这里
function isUserLoggedIn(){
return request.auth != null;
}
function isUserBlocked(uId){
return (('blocked' in get(/databases/$(database)/documents/UserSettings/$(uId)).data) && (request.auth.uid in get(/databases/$(database)/documents/UserSettings/$(uId)).data.blocked));
}
第一个功能运行得很好 但是第二个没有
它抛出该错误
据我所知,功能还可以
请帮助我,在这个棘手的问题上浪费了很多时间
答案 0 :(得分:0)
更新:这些错误是规则模拟器中的错误,请参见下面的道格评论。
我尝试了您的规则,它们在模拟器中按预期工作。
规则:
match /UserProfile {
function isUserLoggedIn(){
return request.auth != null;
}
function isUserBlocked(uId){
return (('blocked' in get(/databases/$(database)/documents/UserSettings/$(uId)).data) && (request.auth.uid in get(/databases/$(database)/documents/UserSettings/$(uId)).data.blocked));
}
match /{uId}{
allow get: if isUserLoggedIn() && !isUserBlocked(uId);
}
}
在模拟器中测试查询:
get /UserProfile/foo
Authenticated: Yes
Firebase UID: bar
根据数据库中的UserSettings/foo
文档,请求成功还是失败:
拒绝请求:
/UserSettings/foo
{
content: "my content"
blocked: { bar: true }
}
允许请求:
/UserSettings/foo
{
content: "my content"
blocked: { otheruser: true }
}
我认为,当数据不存在或格式不正确时,错误可能会弹出。
例如,如果我删除/UserSettings/foo
文档,我也会收到:
Error: simulator.rules line [58], column [28]. Function not found error: Name: [get].
如果blocked
字段不是地图(因为in
是地图的函数),我也会收到此错误:
Error: simulator.rules line [58], column [95]. Function not found error: Name: [in].
您可能可以通过使用exists
并检查blocked
的类型来清除这些错误,但是无论哪种方式,您的规则仍应按预期拒绝请求。