Как заблокировать запросы группы сбора Firestore на основе пути к ресурсу через Правила безопасности Firestore - PullRequest
0 голосов
/ 23 сентября 2019

Я реализую запросы группы сбора 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)
}

, и на самом деле я попробовал это и заставил его работать.Но по деловым причинам я бы предпочел не делать этого таким образом, если это вообще возможно.

1 Ответ

0 голосов
/ 23 сентября 2019

Вы пытаетесь ограничить пользователя, выполняющего вызов db, чтобы он мог только просматривать сообщения, принадлежащие пользователю?

Так выглядит метод SignIn в правилах firestore:

function signedIn() {
  return request.auth.uid != null;
}

и способ ограничить пользователей только операциями crud внутри пути, совпадающего с их идентификатором пользователя

match /users/{userId}/posts/{postsId} {
  allow create, read, update: if request.auth.uid == userId && signedIn();
}
...