当前位置: 首页 > 知识库问答 >
问题:

Firestore安全规则中的递归通配符未按预期工作

白博易
2023-03-14
{
   users: {
      user1:{
         name: Alice,
         groups: {
            groupA:{subbed:true},
            groupB:{subbed:true}
         }
      },
      user2:{
         name: Bob,
         groups: {
            groupC:{subbed:true},
            groupD:{subbed:true}
         }
      }
   }
}

基本上,这是注册的用户ID和每个用户订阅的组ID。我想编写一个安全规则,允许只有当用户是当前auth用户时才访问用户配置文件和子集合,根据我对文档的阅读,我认为通配符可以实现这一点...

match /users/{user=**}{
   allow read,write: if user == request.auth.uid;
}

这样,我就可以很好地读取user文档,但是当我尝试读取groups子集合时,会出现权限错误。我只能通过显式匹配子集合来使它工作...

match /appUsers/{user}{
   allow read,write: if user == request.auth.uid;

   match /groups/{group}{
      allow read,write: if user == request.auth.uid;
   }
}

...所以我的问题是,这两个例子之间有什么区别,我对递归通配符有什么误解?我认为,第一个示例的{user=**}部分应该授予对user文档及其所有子集合、子子集合等无限次的访问权(对于授权用户),并且应该不需要像我在第二个示例中那样专门为存储在下面的html" target="_blank">数据编写规则。

我只是在Firestore上玩了很短时间,所以这可能是一个真正愚蠢的问题:)

谢谢大家

共有1个答案

钱朝明
2023-03-14

当谈到使用递归while卡时,firebase文档有点混乱。我在测试中发现,我需要设置两个规则来授予用户写到users文档和所有子集合(及其子文档)的权限,这是管理用户数据的最合乎逻辑的设置。

你必须定两条规矩。

>

  • 授予用户对/users/{userId}文档的权限
  • 授予用户对从/users/{userId}路径开始的所有子集合及其子文档的权限。

  •  类似资料:
    • 我重新安排了云firestore的安全规则,以防止在集合中重新创建文档。以下是我使用的规则: 我用这些文档路径和用户凭据在控制台中模拟了这些规则 如果我创建了一个id为09-07-2020的文档,并使用上述路径进行模拟,则会失败。当我删除文件09-07-2020时,上述模拟工作正常。因此,它在规则模拟器中运行良好。 但当我在应用程序中尝试时,每次尝试都会再次创建文档。因此,如果文档内容以前不同,则

    • 我编写了一个递归函数,该函数生成 所以如果我写 它应该屈服 但这并不像预期的那样奏效。(显示0)。 在正常的递归函数(返回int而不返回Ienumerable)中,它工作得很好。 问题: 我如何修复代码,使它产生预期的值? 注意:不,没有理由使用递归IEnumerables。这是我玩过递归收益后才想到的。

    • 我有自定义控制器和spring应用程序,其配置如下: 似乎对于一个一致的用户来说,它工作得很好。但是如果我已经授权(使用oauth2),并且我的会话(或令牌)过期了->spring尝试将我重定向到登录页面。 有趣的是,内置endpoint按预期工作,即使会话过期。

    • 下面是C 17形式的规则([basic.lval]/8),但它在其他标准中看起来很相似(C 98中是“lvalue”而不是“glvalue”): 8如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义: (8.4)-对应于对象动态类型的有符号或无符号类型 这条规则听起来像是“除非你做X,否则你会得到UB”,但这并不意味着如果你做了X,你就不会得到UB,正如人们所期望的那样

    • null 基本上数据结构如下所示: 问题是,我应该写什么安全规则来允许用户只在他们所属的组中(拥有组密钥)读取、创建和更新数据?同时,如何禁止用户找出其他群组的密钥?

    • 我已经编写了如下所示的重新调度代码。尽管时间表上写着“每120秒重复一次”,但在结束UpdateQuartzJobTrigger方法后,Execute()方法会立即被调用。