Вопрос:
Для различных коллекций пожарных хранилищ верхнего уровня, приведенных ниже, как ограничить доступ ко всем путям, кроме одного?
Мы создаем схему данных в Firestore для поддержки приложения чата для учителей из нескольких школ.
Коллекции пожарных на высшем уровне включают в себя:
/siteAdminUsers
/schools
/schools/{schoolId}/teachers
/schools/{schoolId}/chats
Ниже приведена настройка правил безопасности, которую мы сейчас пытаемся - где мы проверяем:
- действительный пользователь auth
- ожидаемое значение существует в переменной userClaim
request.auth.token.chatFlatList
Однако прослушиватель чтения для /messages
блокируется.
Сообщение об ошибке:
FirebaseError: [code = access-denied]: отсутствуют или отсутствуют разрешения
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
match /schools/{schoolId}/chats/{discussionId}/messages {
allow write: if false;
allow read: if request.auth != null
&& request.auth.token != null
&& request.auth.token.chatFlatList.val().contains($discussionId);
}
}
Детали
Мы используем облачные функции для всех операций чтения / записи данных, поэтому практически в каждом случае мы можем просто заблокировать доступ всех клиентов.
Единственное исключение - обсуждения в чате, где нам нужно настроить прослушиватель снимков в мобильном клиенте, чтобы знать, когда появляются новые сообщения.
Примечания к подгруппе:
В школе проводятся дискуссионные сессии для школьного персонала (учителей, администраторов и т. Д.)
/schools/{schoolId}/chats/{discussionId}
Где каждый документ для обсуждения содержит:
- список учителей участников
- Подколлекция для фактических сообщений, где каждый документ является отдельным опубликованным сообщением:
/schools/{schoolId}/chats/{discussionId}/messages
Код заявки пользователя из облачной функции
Просматривая журналы облачных функций, мы убедились, что устанавливается userClaim.
return firebaseAdmin
.auth()
.setCustomUserClaims(
uid, {
chatFlatList: 'id1 id2 id3'
}
);
ОБНОВЛЕНИЕ # 1
Попробовал следующий вариант, где правила пропускают / опускают проверку userClaim и auth.token.
Однако, все еще та же ошибка разрешения.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
match /schools/{schoolId}/chats/{discussionId}/messages {
allow write: if false;
allow read: if request.auth != null;
}
}
}