以下场景的正确 Firestore 安全规则是啥?

Posted

技术标签:

【中文标题】以下场景的正确 Firestore 安全规则是啥?【英文标题】:What is the correct Firestore security Rule for the following scenario?以下场景的正确 Firestore 安全规则是什么? 【发布时间】:2021-04-03 18:40:34 【问题描述】:

我有一个这样的 Firestore 数据库

用户 用户 ID 板 boardId 董事会资料

我有这样的 Firestore 安全规则设置。

rules_version = '2';
service cloud.firestore 
  match /databases/database/documents 
    match /document=** 
      allow read: if request.auth != null;
    
    match /users/userId/document=** 
      allow read, create, update, delete: if request.auth != null && request.auth.uid == userId ;
    
  

我应该如何设置规则-

用户只能访问自己的数据。 没有人可以访问根用户集合

【问题讨论】:

你目前的规则有什么问题? 有人说他们可以访问根用户集合中的所有用户。 【参考方案1】:

您的规则中有一个overlapping match statement,因为您使用match /document=** 映射到数据库中的所有 文档(请参阅doc)。

所以,因为:

    在多个允许表达式匹配一个请求的情况下,如果任何一个条件为真,则允许访问,并且 对于match /document=** 语句,您的规则是allow read: if request.auth != null;,那么

每个经过身份验证的用户都可以读取任何user 文档(您不会像对users 集合那样限制uid。实际上您不能这样做,因为match /document=** 没有专门针对users 收藏)。

最好是去掉这个块,只保留下面的块。

match /users/userId/document=** 
  allow read, create, update, delete: if request.auth != null && request.auth.uid == userId ;

如果您需要授予对其他集合的读取权限,请为每个集合使用规则,而不是使用通配符方法。


PS:你可以仔细检查你是否真的需要做match /users/userId/document=**,它授予访问users 文档的所有子集合的权限。你可能只需要match /users/userId

【讨论】:

以上是关于以下场景的正确 Firestore 安全规则是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 安全规则 - 如何检查某个字段是不是被修改?

Firestore安全规则奇怪的行为

如何检查传入号码数据是否大于或小于Firestore安全规则中的特定限制?

Firestore 安全规则:如果时间戳 (FieldValue.serverTimestamp) 等于现在

Firestore创建的安全规则不符合预期

Android 应用的 Firestore 安全设置应该是啥? [关闭]