Это зависит от того, как вы пытаетесь читать из коллекции.
Если вы пытаетесь прочитать конкретный документ (например, /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()
В этом последнем примере правила безопасности могут подтвердить, что запрос запрашивает только те сообщения, к которым у них есть доступ, поэтому он разрешает запрос.
Подробнее об этом см .: