Вот проблема, с которой я сейчас сталкиваюсь с правилами безопасности Firestore.
Прежде всего, вот пример структуры данных в моей базе данных firestore:
userProfiles/userId/userData
companies/companyId/companyData
Looksдовольно простоКаждый userData
включает в себя и массив с именем companies
, который включает все идентификаторы компаний, к которым у этого пользователя есть доступ.
Теперь мне нужно написать правила, разрешающие чтение companyData, только если companyId находится в определенном списке компаний с информацией о пользователях.
Вот правила, которые работают для меня:
service cloud.firestore {
match /databases/{database}/documents {
match /companies/{companyId} {
allow read: if companyId in get(/databases/$(database)/documents/userProfiles/$(request.auth.uid)).data.companies
}
}
}
Учитывая тот факт, что у меня будет гораздо больше правил, я хотел бы сделать их более читабельнымии удобно использовать повторно.В соответствии с этим официальным руководством я могу создавать пользовательские функции, и в соответствии с этой статьей они могут быть общими и объявлены вне рамок основных правил.
Я изменил свои правилачтобы это выглядело так, и это также сработало для меня :
service cloud.firestore {
match /databases/{database}/documents {
match /companies/{companyId} {
allow read: if companyId in getUserCompanies()
}
function getUserCompanies() {
return get(/databases/$(database)/documents/userProfiles/$(request.auth.uid)).data.companies
}
}
}
Но теперь я бы хотел переместить функцию за пределы блока правил, чтобы сделать ее еще более понятной:
service cloud.firestore {
match /databases/{database}/documents {
match /companies/{companyId} {
allow read: if companyId in getUserCompanies()
}
}
}
function getUserCompanies() {
return get(/databases/$(database)/documents/userProfiles/$(request.auth.uid)).data.companies
}
И это не работает.Никаких ошибок нет, я просто получаю обычное сообщение Read denied
от симулятора.
Итак, вопросы: возможно ли переместить функцию наружу, как я это сделал в своем примере?Есть ли какие-то очевидные ошибки, которые я сделал здесь?Есть ли лучший способ сделать мои правила еще более понятными?
PS Я также попытался передать некоторые параметры этой функции, включая идентификаторы пользователя и компании - не повезло.