Firebase数据库规则设置为仅供所有者读取

问题描述 投票:-1回答:1

我下载了一个简单的演示项目,我正在尝试进行一些简单的更改。但是我无法弄清楚如何设置数据库规则,因此只有有人创建了项目才能打开与项目的链接。现在可以打开所有登录的人的项目链接。

数据库规则文件:

{
  "rules": {
    ".read": "auth !== null",
    ".write":"auth !== null",
    "users": {
      "$uid": {
        ".write": "auth !== null && $uid === auth.uid",
        ".read": "$uid === auth.uid"
      }
    },
    "projects": {
      ".indexOn": ["createdBy"]
    }
  }
}

我想知道如何像"projects":一样向".read": "createdBy === auth.uid"添加行,但是这行不通。感谢您的帮助。

firebase firebase-realtime-database firebase-security-rules
1个回答
0
投票

一旦授予用户对节点的读写权限,他们就对该节点下的所有数据都具有该权限。您不能在较低级别取消许可。在文档中的rules cascade下对此进行了提及。

在您的规则的顶层,您向用户授予此权限:

".read": "auth !== null",
".write":"auth !== null",

鉴于以上说明,这意味着任何已登录的用户都具有对整个数据库的读/写访问权限。您在较低级别拥有的任何读/写规则都将被忽略。

所以您的第一步将是删除这些顶级访问规则。


接下来,您要允许用户仅在创建项目后才能阅读该项目。在规则中将是:

"projects": {
  ".indexOn": ["createdBy"],
  "$projectid": {
    ".read": "auth.uid == data.child('createdBy').val()"
  }
}

[如果创建了/projects/myproject,则用户可以读取myproject


请注意,根据上述规则,没有用户可以从/projects中进行读取,因为您没有授予任何人对该节点的读取权限。 Firebase安全性不会代表您过滤任何数据,它们只是检查是否允许操作。有关更多信息,请参见rules are not filters上的文档。

如果您希望用户能够运行查询以获取他们已创建的所有项目,则需要做两件事:

  1. 仅查询那些项目的查询。

    ref.orderByChild("createdBy").equalTo(uid)
    
  2. /projects上的一条规则,仅允许该查询。

    "projects": {
      ".read": "auth.uid != null &&
                query.orderByChild == 'createdBy' &&
                query.equalTo == auth.uid"
    }
    

因此,当查询仅请求用户自己创建的项目时,只允许读取/projects。因此,安全规则和代码可以共同确保用户仅获得他们有权读取的数据。

有关此最后一个主题的更多信息,请参见query based rules上的文档。

© www.soinside.com 2019 - 2024. All rights reserved.