Я пытаюсь ограничить доступ пользователей к какому-либо высокоуровневому узлу, но хочу дать некоторым пользователям возможность читать некоторые из подузлов.
Моя структура данных выглядит так:
{
"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
не могут читать информацию о компании, в разрешении отказано.