swift - 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...
解决方案
您正在尝试从数据库的根目录 ( root?.observeSingleEvent(...
) 读取,但您只授予单个用户和运动鞋节点的访问权限。由于您尝试阅读的内容超出了您的访问权限,因此 Firebase 会拒绝您的观察者。
很难说为什么有时您没有收到此错误,但很可能是缓存问题。要么您的新规则尚未应用(这应该很少见),要么您正在从 iOS 设备的缓存中读取数据(当您仍然可以访问时数据存储在该缓存中)。
无论哪种方式,您都应该确保只读取您有权访问的数据。所以:
root?.child("sneakers/nike")?.observeSingleEvent(of: .value, with: {
(snapshot) in
// sneakers node might not exist
if snapshot.exists() {
....
}
)}
推荐阅读
- airconsole - 我可以在空调上开发一个主屏幕上的按比例缩小版本的控制器吗?
- visual-studio-code - 使用扩展 API 将 EOL 更改为“LF”
- javascript - 如何在 Angular 应用程序中捕获“net::ERR_CERT_AUTHORITY_INVALID”以处理 SSL 证书问题?
- python - Python - 将数据从列表添加到表时出错
- powershell - 我可以隐藏 Import-Module 的定义吗?
- javascript - gapi.client.init() 承诺不返回任何内容
- javascript - 从组件获取数据到另一个页面视图
- javascript - 提交带有动态表单域的表单
- bash - 重击 | 在脚本循环遍历文件数组时附加文件编号
- javascript - React Component 和 render 方法被调用了两次