在我的应用程序中,我有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...
答案 0 :(得分:0)
您尝试从数据库的根目录(root?.observeSingleEvent(...
)进行读取,但您只能授予对单个用户和运动鞋节点的访问权限。由于您尝试阅读的内容超出了您的访问权限,因此Firebase会拒绝您的观察者。
很难说为什么有时候你没有得到这个错误,但很可能它是一个缓存问题。您的新规则尚未应用(这应该是罕见的),或者您正在从iOS设备的缓存中读取(当您仍然 时,数据已存储在其中)有权访问)。
无论哪种方式,您都应该确保只读取您有权访问的数据。所以:
root?.child("sneakers/nike")?.observeSingleEvent(of: .value, with: {
(snapshot) in
// sneakers node might not exist
if snapshot.exists() {
....
}
)}