Code: Select all
{
members: ['abc','def'] // 2 element list of member UIDs
// some other chat metadata
}
Code: Select all
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();
Code: Select all
allow list: if authed();Code: Select all
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)
);
Nach dem, was ich zu dieser letzten Klausel gelesen habe, gibt es keine Möglichkeit, die where-Klausel der tatsächlichen Abfrage zu überprüfen und sicherzustellen, dass userId mit request.auth.uid übereinstimmt und dass die Leseregel, die für jede Person gilt, übereinstimmt Das Dokument sollte das Lesen der Chats eines anderen Benutzers verhindern, aber das scheint bei mir nicht zu passieren.
Könnte mir jemand helfen und sagen, was ich in meiner Regel falsch gemacht habe? Hier war die tatsächliche Nutzlast für diesen Anruf:
Code: Select all
{
"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
}
}

Allerdings, wenn ich die obige Benutzer-ID durch die UID eines anderen Benutzers ersetze ('5Sdmw2sxJBdp0YnW3LtqgfYMrW83', als wen ich nicht authentifiziert bin), hier ist ein zurückgegebenes Beispieldokument, das nicht zurückgegeben werden sollte, da es sich um eine private Konversation zwischen zwei anderen Benutzern handeln sollte (HINWEIS: Der Screenshot zeigt memberUids anstelle von member, da ich die Eigenschaft umbenannt habe, aber gehen Sie davon aus, dass der Wert im Foto Members heißt, um mit allen zuvor bereitgestellten Codeausschnitten übereinzustimmen ):

Mobile version