Как я могу сравнить 2 записи для разрешения (Firestore-Rule) - PullRequest
0 голосов
/ 24 марта 2019

Я определяю правила для своей базы данных пожарного магазина и застрял там. У меня есть коллекция постов и коллекция userProfile. Если пользователь забанил вас, вы не сможете добраться до его поста. Вы можете указать, кто из пользователей поделился сообщением в разделе «документ / пользователь»

Так что я пытаюсь эту команду, но не работает. Когда я имитирую это, каждый получает отказ.

match /posts/{currentDocument} {
  allow read: if !exists(
    /databases/$(database)/documents/userProfile/$(request.auth.uid)/banned/
    $(/databases/$(database)/documents/posts/$(currentDocument)/user)
  )
}

Итак, я хочу принять все запросы на чтение, кроме заблокированных пользователей.

1 Ответ

0 голосов
/ 24 марта 2019

Это зависит от того, как вы пытаетесь читать из коллекции.

Если вы пытаетесь прочитать конкретный документ (например, /posts/post123), который не принадлежит запрещенному пользователю, чтение должно работать. И если вы пытаетесь прочитать конкретный документ от забаненного пользователя, чтение должно быть отклонено.

Если вы пытаетесь прочитать всю коллекцию /posts, это действительно не удастся с приведенными выше правилами безопасности. Причина в том, что правила безопасности не фильтруют ваши данные; они просто гарантируют, что операция чтения только пытается прочитать данные, для которых она авторизована. И чтение всего /posts не разрешено, так как есть определенные документы, которые не читаются.

Чтобы прочитать все сообщения от небанкованных пользователей, вам нужно присоединить слушателя, который только пытался прочитать эти документы. В псевдокоде это будет что-то вроде:

db.collection('posts').where('user', 'not in', '/bannedusers')

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

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

// anyone can read approved posts, but only the author can read unapproved posts
allow read: if resource.data.approved == true || request.auth.uid == resource.data.author

А затем запросите только утвержденные сообщения с:

db.collection("posts").where("approved", "==", true).get()

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

Подробнее об этом см .:

...