Я пишу правила Firestore для приложения для Android, которое я сейчас разрабатываю. У меня проблемы с написанием правил безопасности. Я хочу иметь набор редакторов, в которых каждый документ назван в честь идентификатора пользователя и хранит в себе роль этого идентификатора пользователя.
Путь к документу для каждого редактора: users/(userId доступа к данным владельца)/editors/(userId пользователя, осуществляющего доступ). Поле, содержащее роль, — «Роль», и в настоящее время единственная роль — «Владелец». Таким образом, он отображается в базе данных как Роль: «Владелец».
match /users/{userId} {
allow read, write: if getUserData().Role == "Owner";
}
function isSignedIn() {
return request.auth != null;
}
function getUserData()
{
return get(/databases/$(database)/documents/users/$(userId)/editors/$(request.auth.uid)).data;
}
Имитация чтения и записи в настоящее время запрещена.
Учитывая, как ограничены ваши функции, вам нужно будет передать userId
в вызов getUserData
:
match /users/{userId} {
allow read, write: if getUserData(userId).Role == "Owner";
}
function isSignedIn() {
return request.auth != null;
}
function getUserData(userId)
{
return get(/databases/$(database)/documents/users/$(userId)/editors/$(request.auth.uid)).data;
}
Мне непонятно, почему database
и request.auth.uid
попали в область действия этой функции, а userId
нет. Хочешь объяснить?
Пожалуйста, используйте тег
android-studio
только для вопросов о самой Android Studio IDE. Если у вас есть вопросы о программировании для Android в целом, используйте тегandroid
.