У меня есть структура базы данных Firebase с несколькими корневыми узлами (для этого вопроса важны только несколько): Buildings и BuildingUserId (намерение BuildingUserUid заключается в контроле доступа пользователей к их зданиям и только к их зданиям.)
Если мы немного углубимся в структуру обоих узлов, мы получим следующее:
users
`-- userID // one user can access this
| `-- isAdmin
| `-- building pushkey
| `-- another building pushkey etc.
`-- another userID // one user can access this
| `-- isAdmin
| `-- building pushkey
| `-- another building pushkey etc.
`-- another user UID etc.
buildingsUserUid
`-- firebase user UID // one user can access this
| `-- building pushkey
| `-- another building pushkey
`-- another firebase user UID // another user can access this
`-- yet another building pushkey
`-- and another building pushkey etc.
buildings
`-- building pushkeys // user with right UID can access this
| |-- firebase user UID
| `-- Other data
`-- building pushkeys //another user with right UID can access this
|-- firebase user UID
`-- Other data
Тогда мои правила для firebase выглядят так:
{
"rules": {
"users": {
"$uid": {
".read": "auth.uid == $uid",
".write": "auth != null && $uid === auth.uid",
}
},
"buildings": {
".read": "root.child('buildingsUserUid').hasChild(auth.uid)",
".write": "!data.exists() || root.child('buildingsUserUid').hasChild(auth.uid)",
"$pushkey": {
".read": "root.child('buildingsUserUid').child(auth.uid).hasChild($pushkey)",
".write": "!data.exists() || root.child('buildingsUserUid').child(auth.uid).hasChild($pushkey)",
}
},
"buildingsUserUid": {
"$user": {
".read": "auth != null && auth.uid === $user",
".write": "auth != null && auth.uid === $user"
}
},
}
С помощью приведенных выше правил я надеялся ограничить доступ к узлам здания только тем пользователем, у которого был ключ здания на узле buildingUserUid.Однако, если я console.log (this) в моем приложении vue.js, я смогу увидеть все здания.
Это потому, что я регистрирую это из приложения или пользователь сможет получить доступ к этому так же с консоли браузера?Я что-то упускаю в своих правилах?
ОБНОВЛЕНИЕ:
После ответа @Umar я изменил свои правила на:
{
"rules": {
"users": {
"$uid": {
".read": "auth.uid == $uid",
".write": "auth != null && $uid === auth.uid",
}
},
"buildings": {
".read": "root.child('buildingsUserUid').hasChild(auth.uid)",
".write": "!data.exists() || root.child('buildingsUserUid').hasChild(auth.uid)",
"$pushkey": {
// changed the following 'read' rule line
".read": "root.child('buildingsUserUid').child($pushkey).child('userId') === auth.uid"
".write": "!data.exists() || root.child('buildingsUserUid').child(auth.uid).hasChild($pushkey)",
}
},
"buildingsUserUid": {
"$user": {
".read": "auth != null && auth.uid === $user",
".write": "auth != null && auth.uid === $user"
}
},
}
Но это вызывает ошибку:
Ошибка сохранения правил - Строка 15: Неверное выражение ==: левый операнд не является числом, логическое значение, строка, ноль.-
Есть мысли?