Firebase规则失败:permission_denied

时间:2018-05-21 22:12:40

标签: swift firebase firebase-realtime-database firebase-security

在我的应用程序中,我有vc1推送vc2。在vc2里面,我从Firebase中提取了一些数据。

问题是当我将规则设置为以下值时,当vc2被推上时我会继续failed: permission_denied

{
  "rules": {
      "sneakers": {
      ".read": "auth != null || auth.uid === null",
      ".write": "auth.uid != null"
    },
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

如果我回到vc1,将值更改为以下值,那么我没有遇到任何问题我可以访问

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

但事情就是这样,一旦我将它们设置回第一个值,回到vc1然后继续vc2然后我仍然可以访问数据库。如果我删除该应用并重新启动它,则该过程会自行重复。

我想使用第一个值,因为我想保持用户节点上的数据安全。

为什么我不会继续使用我的第一个值permission_denied,对规则进行更改,然后在我更改它之后我不再获得permission denied?我的规则在哪里出错

VC2:

let root = Database.database().reference()

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        root?.observeSingleEvent(of: .value, with: {
              (snapshot) in

               // sneakers node might not exist                   
               if snapshot.hasChild("sneakers/nike)"){
                   ....
               }
        )}
}

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        root?.removeAllObservers()
}

数据库布局:

root
  |
  @-sneakers // this node might not exist
  |    |
  |   nike
  |
  @-users
  |    |
  |   uid
  |
  @-jackets...

1 个答案:

答案 0 :(得分:0)

您尝试从数据库的根目录(root?.observeSingleEvent(...)进行读取,但您只能授予对单个用户和运动鞋节点的访问权限。由于您尝试阅读的内容超出了您的访问权限,因此Firebase会拒绝您的观察者。

很难说为什么有时候你没有得到这个错误,但很可能它是一个缓存问题。您的新规则尚未应用(这应该是罕见的),或者您正在从iOS设备的缓存中读取(当您仍然 时,数据已存储在其中)有权访问)。

无论哪种方式,您都应该确保只读取您有权访问的数据。所以:

root?.child("sneakers/nike")?.observeSingleEvent(of: .value, with: {
      (snapshot) in

       // sneakers node might not exist                   
       if snapshot.exists() {
           ....
       }
)}