首页 > 解决方案 > Firebase 规则:权限被拒绝

问题描述

我正在尝试限制用户访问某些高级节点,但希望让某些用户能够读取某些子节点。

我的数据结构是这样的:

{
  "COMPANIES" : {
    "COMPANY1" : {
      "id" : "COMPANY1",
      "name" : "COMPANY1 COMPANY"
    },
    "COMPANY2" : {
      "id" : "COMPANY2",
      "name" : "COMPANY2 COMPANY"
    }
  },

  "USERS" : {
    "xZgFtwVyQFsPK3428YCa3NekOEF3" : {
      "company" : {
        "COMPANY1" : true,
        "COMPANY2" : true
      },
      "email" : "ss@sss.com",
      "uid" : "xZgFtwVyQFsPK3428YCa3NekOEF3",
      "username" : ""
    }
  }
}

等等。

我的规则是:

{
  "rules": {
    "USERS": {
      "$uid": {
        ".read": "auth != null && auth.uid == $uid",
        ".write": "auth != null && auth.uid == $uid"
      }
    },

    "COMPANIES": {
      "COMPANY1": {
        ".read": "root.child('USERS').child(auth.id).child('company').child('COMPANY1').val() == true",
        ".write": false
      }
    }
  }
}

我用来访问这些数据的代码如下所示(在 Swift 中):

refFire.child("COMPANIES").child("COMPANY1").observe(DataEventType.value, with: { (dsnap) in

另外,我试过这个:

refFire.child("COMPANIES").queryOrdered(byChild: "COMPANY1").queryEqual(toValue: "COMPANY1").observe(DataEventType.value, with: { (dsnap) in

而这个(不幸的是,我并不真正理解背后的想法queryEqual,所以我尝试了不同的方法):

refFire.child("COMPANIES").child("COMPANY1").queryOrdered(byChild: "COMPANY1").queryEqual(toValue: "COMPANY1").observe(DataEventType.value, with: { (dsnap) in

因此,我想将 COMPANY1 的访问权限授予COMPANY1 = true其个人资料中的用户(并拒绝其他所有人)。规则似乎相对简单,但显然我在这里做错了,因为即使用户COMPANY1 = true无法阅读公司信息,权限也会被拒绝。

标签: swiftfirebasefirebase-realtime-databasefirebase-security

解决方案


推荐阅读