У меня есть два пользователя, созданные на моей консоли Firebase, у обоих есть другое имя пользователя и адрес электронной почты.Swift + Firebase Безопасность не работает
Я хочу, чтобы они могли хранить свою оценку онлайн в базе данных. Это структура:
AppName
- GameStats
- DBW9WQEs2sQn9CuPTE9t7Q1qWSz2
- Score : 0986
- Li75C2BYW7bQnKqMmrqLAZ67HUy4
- Score : 44131
Чтобы получить это значение, и держать его синхронизируется я использую это:
let baseRef = FIRDatabase.database().reference(withPath: "GameStats/" + user.uid + "")
let scoreRef = scoreRef.child("Score")
scoreRef.observe(.value, with: { snapshot in
print(snapshot.value)
})
Я хотел проверить, может ли два пользователя получить доступ к другой информации от другого пользователя. Я изменил линию, чтобы включить другие user.uid
вот так:
let baseRef = FIRDatabase.database().reference(withPath: "GameStats/Li75C2BYW7bQnKqMmrqLAZ67HUy4")
// Logged in User: DBW9WQEs2sQn9CuPTE9t7Q1qWSz2
и по какой-то причине он выдает это:
Optional(44131)
Если изменить значение в базе данных, она автоматически обновляет значение в один я положил.
Это неправильный пользователь и по какой-либо причине имеет к нему доступ.
Это мои правила:
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"GameStats": {
"$user_id": {
".write": "auth != null && auth.uid === $user_id && auth.provider === 'password'",
".read": "auth != null && auth.uid === $user_id && auth.provider === 'password'"
}
}
}
}
Почему приложение позволяет одному пользователю читать чужие пользователи данных и как ограничить доступ, так что пользователь может получить доступ к данным только по их идентификатору пользователя?
Как предложил @M_G, я достал .write
от родителя и .read
. Так что мои правила теперь:
{
"rules": {
// ".read": "auth != null",
// ".write": "auth != null",
"GameStats": {
"$user_id": {
".write": "auth != null && auth.uid === $user_id && auth.provider === 'password'",
".read": "auth != null && auth.uid === $user_id && auth.provider === 'password'"
}
}
}
}
я теперь получить этот вывод:
[FirebaseDatabase] setValue: or removeValue: at /GameStats/DBW9WQEs2sQn9CuPTE9t7Q1qWSz2 failed: permission_denied - This is for the correct user too. I get this error if wrong user also.
Вы пытались удалить общее правило '.write'? –
@M_G Вы имеете в виду: «.write»: «auth! = Null»? Хотя эти правила относятся только к родителям. поэтому спецификация дочерних правил – JamesG
Я бы попробовал, так как правило написания GameStats кажется правильным. –