У меня есть база данных firestore со следующими правилами:
Правила Firebase
service cloud.firestore {
function signedIn() {
return request.auth != null && request.auth.uid != null;
}
function isAuthorized(accountId) {
return signedIn() && exists(/databases/$(database)/documents/accounts/$(accountId)/users/$(request.auth.uid));
}
match /databases/{database}/documents {
match /users/{uid} {
allow read, write: if signedIn() && uid == request.auth.uid;
}
match /users/{uid}/{document=**} {
allow read, write: if signedIn() && uid == request.auth.uid;
}
match /accounts/{accountId} {
allow read: if isAuthorized(accountId);
}
match /accounts/{accountId}/{document=**} {
allow read, write: if isAuthorized(accountId);
}
match /{document=**} {
allow read, write: if false;
}
}
}
База данных записей
Существующие записи в БД
- / пользователей / U123
- / счета / AXYZ / пользователи / U123
Проблема
Я ожидаю, что пользователь вошел в систему с помощью uid: u123 имеет доступ для чтения к / account / axyz
Однако Simulator просто выдает ошибку Simulated read denied
, не давая никаких подсказок (какая строка / правило вызывает сбой / отказ ..)
Вопрос ??
- В чем проблема с этими правилами?
- Почему симулятор не может объяснить причину?
Любая помощь будет высоко ценится. Спасибо!
Обновление 1
Если я заменю вызов функции isAuthorized(accountId)
на тело функции, как показано ниже, то он будет работать отлично.
match /accounts/{accountId} {
allow read: if signedIn() && exists(/databases/$(database)/documents/accounts/$(accountId)/users/$(request.auth.uid));
}
match /accounts/{accountId}/{document=**} {
allow read, write: if signedIn() && exists(/databases/$(database)/documents/accounts/$(accountId)/users/$(request.auth.uid));
}
Так что это работает так. Но все еще задаюсь вопросом, почему вызывать функцию не удается.