Попытка запустить Angular Firestore с помощью angularfire2. В моей конфигурации правил firebase у меня есть оператор OR, и я могу читать все документы с published == true
, но не могу установить флаг isAdmin()
в true и читать все документы. Мой сервер Firestore правила похож на
service cloud.firestore {
match /databases/{database}/documents {
function isAdmin() {
return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
}
match /myDocs/{myDoc} {
allow read: if resource.data.published == true || isAdmin();
}
}
}
Я также проверил /users/$(request.auth.uid)
как путь без успеха. Открытый запрос на стороне клиента для флага published==true
выглядит как
const myDocsCollection = this.db.collection('myDocs', ref => ref.where('published', '==', true));
const myDocs = myDocsCollection.snapshotChanges();
И работает довольно хорошо. Но я не могу заставить работать запрос на основе аутентификации, поскольку он не зависит от resource
в правилах. Документы в этом случае довольно слабые.
Я пытался использовать .where('auth', '==', firebase.auth().currentUser.uid)
, но это не работает, и это не имеет особого смысла. Также проверяется только оператор isAdmin()
без чего-либо еще и без предложения where
. Всегда возвращает недостаточно прав . Нужно ли передавать данные авторизации вручную или Firebase включает данные аутентификации по умолчанию?
Это фрагмент базы данных пользователей, и ключ определенно равен пользователям uid
. В админке я запрашиваю данные с
get(): Observable<MyDoc[]> {
console.log(firebase.auth().currentUser); // returns user with correct uid
const myDocsCollection = this.db.collection('myDocs');
return myDocs = myDocsCollection.snapshotChanges().pipe(/* do some mapping, apply docid */);
}