Я реализую запросы группы сбора Firestore в приложении и хочу создать правило безопасности, которое блокирует доступ пользователям, которым принадлежит ресурс, к которому они пытаются запросить
Данные в Firestore структурированы следующим образомusers/1234/.../posts/5678
.Я хотел бы извлечь путь к ресурсу, который запрашивается через группу сбора, а затем передать извлеченный userId (в данном случае 1234
) в мой метод signedIn()
, который просто проверяет userId по отношению к пользовательскому токену.Я знаю, что этот signedIn()
метод работает правильно, потому что у меня есть другие правила, которые полагаются на него, которые работают отлично.
Я попробовал следующее в моем файле firestore.rules:
// collection groups
match /{path=**}/posts/{post} {
allow read: if resource['__name__'][0] == "users" && signedIn(resource['__name__'][1])
}
AND
// collection groups
match /{path=**}/posts/{post} {
allow read: if path[0] == "users" && signedIn(path[1])
}
К сожалению, при любом из этих подходов я по-прежнему получаю сообщение об ошибке отказа в разрешении при попытке запросить группу сбора posts
.Я даже не могу найти какой-либо хороший способ отладки этого, потому что симулятор на приборной панели, кажется, не очень полезен для запросов групп сбора.
PS Я знаю, что мог бы добавить поле userId
кpost
документ, а затем напишите правило, подобное этому:
// collection groups
match /{path=**}/posts/{post} {
allow read: if signedIn(resource.data.userId)
}
, и на самом деле я попробовал это и заставил его работать.Но по деловым причинам я бы предпочел не делать этого таким образом, если это вообще возможно.