首页 > 解决方案 > Firebase 规则失败:permission_denied

问题描述

在我的应用程序中,我有 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...

标签: swiftfirebasefirebase-realtime-databasefirebase-security

解决方案


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

很难说为什么有时您没有收到此错误,但很可能是缓存问题。要么您的新规则尚未应用(这应该很少见),要么您正在从 iOS 设备的缓存中读取数据(当您仍然可以访问时数据存储在该缓存中

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

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

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

推荐阅读