Код: Выделить всё
{
members: ['abc','def'] // 2 element list of member UIDs
// some other chat metadata
}
Код: Выделить всё
function authed() {
return request.auth != null;
}
match /chats/{chatId} {
allow create: if authed()
&& request.resource.data.members is list
&& request.resource.data.members.size() == 2
&& request.auth.uid in request.resource.data.members;
allow read, update: if authed()
&& resource.data.members is list
&& request.auth.uid in resource.data.members;
allow list: if authed();
Код: Выделить всё
allow list: if authed();Код: Выделить всё
const chatsRef = collection(firestoreDb, 'chats');
const LAST_MESSAGE_AT_PROPERTY: keyof Chat = 'lastMessageAt';
const MEMBER_PROPERTY: keyof Chat = 'members';
const q = query(
chatsRef,
where('members', 'array-contains', userId),
orderBy('lastMessageAt', 'desc'),
limit(20)
);
Из того, что я прочитал в этом последнем предложении, я не могу проверить фактическое предложениеwhere запроса и убедиться, что userId соответствует request.auth.uid, и что правило чтения, которое применяется к каждому отдельному сопоставленному документу должен запрещать чтение чатов других пользователей, но, похоже, у меня этого не происходит.
Может ли кто-нибудь помочь мне сказать, что я не так сделал в своем правиле? Вот фактическая полезная нагрузка для этого вызова:
Код: Выделить всё
{
"database": "projects/my-project/databases/(default)",
"addTarget": {
"query": {
"structuredQuery": {
"from": [{ "collectionId": "chats" }],
"where": {
"fieldFilter": {
"field": { "fieldPath": "members" },
"op": "ARRAY_CONTAINS",
"value": { "stringValue": "5Sdmw2sxJBdp0YnW3LtqgfYMrW83" }
}
},
"orderBy": [
{
"field": { "fieldPath": "lastMessageAt" },
"direction": "DESCENDING"
},
{ "field": { "fieldPath": "__name__" }, "direction": "DESCENDING" }
],
"limit": 20
},
"parent": "projects/my-project/databases/(default)/documents"
},
"targetId": 2
}
}

Однако, когда я заменяю указанный выше идентификатор пользователя на UID другого пользователя ('5Sdmw2sxJBdp0YnW3LtqgfYMrW83', под которым я не аутентифицирован), вот возвращенный пример документа, который не следует возвращать, поскольку это должен быть частный разговор между двумя другими пользователями (ПРИМЕЧАНИЕ: на снимке экрана показаныmemberUids вместоmembers, поскольку я переименовал свойство, но предположим, что на фотографии значение называетсяmembers, чтобы совпадать со всеми ранее предоставленными фрагментами кода ):

Подробнее здесь: https://stackoverflow.com/questions/798 ... members-of
Мобильная версия