【问题标题】:Security rules with dynamic paths具有动态路径的安全规则
【发布时间】:2016-07-29 02:44:16
【问题描述】:

假设我有一个具有以下结构的数据库:

  • 权限
    • $pId(从推送中自动生成的 id)
      • 用户ID
      • 房间号
      • 许可
  • 用户
    • $uId
      • 姓名
  • 房间
    • $rId
      • 姓名

是否可以编写一条规则说“如果存在 p.userId = auth.uid and p.roomId = $rId and p.permission = 'admin' 的权限 p,则允许用户修改房间”?

据我所知,如果没有在每个房间下嵌套权限信息,这是不可能的。

【问题讨论】:

    标签: firebase firebase-security firebase-authentication


    【解决方案1】:

    你需要稍微改变一下你的结构。与其使用推送 ID 来识别权限,不如使用更受控制的结构。例如:

    "Permissions": {
      "roomId": {
        "userId": "role"
      }
    }
    

    现在您可以按照自己的意愿保护房间:

    {
      "rules": {
        "Room": {
          "$rId": {
            ".write": "root.child('Permissions').child($rId).child(auth.Id).val() == 'admin'"
          }
        }
      }
    }
    

    另一个好处是,如果您想撤销用户的权限,您不必扫描所有权限。

    【讨论】:

    • 啊,谢谢。但是,查询“给我一个用户所属的所有房间”以及“给我一个房间中的所有用户”会更加困难。目前我正在使用“ref.orderByChild(child).equalTo(value).on”来给我想要的东西,这取决于它是用户 id x 的权限还是房间 id y 的权限。这是低效的,因为由于 orderByChild 的工作方式,我一次只能取回一个孩子。您认为推荐的设置是 PermissionsByUser 和 PermissionsByRoom 作为单独但重复的分支吗?
    • 将其解析为文本有点困难。但一般而言,在 NoSQL 中对数据进行建模时,最好以应用程序需要访问数据的方式对数据进行建模。因此,如果您想为用户显示房间列表,请存储每个用户的房间。所以不要ref.child('rooms').orderByChild('userid').equalTo(auth.uid),而是ref.child('userRooms').child(auth.uid)。最后一个非常便宜,代价是更多重复的数据结构。死便宜的秤真的很好。 :-) 另见firebase.com/blog/2013-04-12-denormalizing-is-normal.html
    猜你喜欢
    • 2018-11-25
    • 2018-11-15
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多