【问题标题】:Function not found error: Name: [get]. in firestore security rules simulation找不到函数错误:名称:[get]。在firestore安全规则模拟
【发布时间】:2019-09-21 04:21:32
【问题描述】:
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));
}

第一个函数运行得很好 但第二个没有

它会抛出该错误

据我所知,该功能还可以

请帮助我在这个棘手的问题上浪费了很多时间

我尝试过的

  1. 我在其中一个线程中读到这是一个临时问题 但事实并非如此。现在已经超过 48 小时了
  2. 在某处还提到,这只是模拟器中的一个错误,但代码将运行顺利,即使情况并非如此。在代码中,错误是我所期望的权限不足
  3. 我已经正确阅读了文档,所以我的代码没问题已经在其他规则中测试了 get 方法并且它工作正常

就是这样,请帮忙

【问题讨论】:

  • 您是否为此提交了错误?我在我的环境中看到了同样的事情,而不仅仅是在模拟器中。使用了几个月的规则现在突然失效了。
  • @HondaGuy firebase 开发人员已经知道这一点。查看接受答案的 cmets,Doug Stevenson himslef [他为 firebase 工作] 说开发人员知道这一点

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


【解决方案1】:

更新:错误是规则模拟器中的错误,请参阅下面 Doug 的评论。

我尝试了您的规则,它们在模拟器中按预期工作。

规则:

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 的类型来清除这些错误,但无论哪种方式,您的规则仍应按预期拒绝请求。

【讨论】:

  • 我将其称为模拟器中的错误,因为不存在的文档不应该产生这样的错误。但它应该不符合规则。
  • 已与团队确认 - 这是模拟器中的错误。
  • 非常感谢这两个人,这个答案很好,实际上昨天就是这种情况,只是我发现这个错误出现在不存在的字段上,模拟器应该抛出一个错误,比如“字段不存在”但是它说“找不到方法”,这件事浪费了很多时间
  • @DougStevenson juan [无法标记他] 哈哈,请阅读上面的评论
  • 我试图以这种方式解决此错误(使其在模拟器中工作):function isAdmin() { return isAuth() && exists(/database/$(database)/documents/users/$(request.auth.uid)) && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true; } 但添加exists() 调用会使模拟器给出“未知错误”。
猜你喜欢
  • 2021-07-24
  • 2020-08-22
  • 2018-03-19
  • 2021-05-12
  • 2018-03-17
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
相关资源
最近更新 更多