Obecnie próbuję zbudować małą aplikację na bazie ogniowej jako jej ocenę. Wygląda na interesującą i bardzo produktywną, ale mam jeden problem z regułami firewall.Sklep Firestore odczytuje reguły z samodoskonaleniem
Mam jeden zbiór (Games) z obiektami wygląda tak:
{
"name":String,
"description":String,
"owners":
{
"uid": String
"uid2": String
}
}
i reguł określonych tak:
service cloud.firestore {
match /databases/{database}/documents {
match /games {
match /{game} {
allow write: if request.auth != null && request.resource.data.owners[request.auth.uid] == 'ADMIN';
allow update: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN';
allow read: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN';
}
}
}
}
podczas odczytu, aktualizacji działać prawidłowo. Tylko odczyt działa dla pojedynczych dokumentów. Kiedy próbuję odczytać kolekcję, dostaję błąd dostępu, tak jakby użytkownik nie miał do tego prawa. Część, która sprawia, że nie działa to
resource.data.owners[request.auth.uid] == 'ADMIN'.
Dodawanie where("owners."+auth.uid,"==", 'ADMIN')
do kolekcji zapytanie nie pomogło.
Co ja tu robię źle? Czy istnieje podobne podejście w firewallu firewall dla podobnego scenariusza?
EDIT: Próbowałem dodanie 'get' i zasady 'listy' tak:
allow list: if request.auth != null;
allow get: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN';
To nie działa zgodnie z oczekiwaniami. Spodziewałem się, że pozwoli mi to wyświetlić listę dokumentów pod numerem where
, ale jeśli istnieje dokument, którego nie mogłem uzyskać, to oczekiwałbym, że otrzymam komunikat "Brakujące lub niewystarczające uprawnienia". Mogłem tylko wyświetlić listę WSZYSTKICH dokumentów, ale nie przeczytałem niektórych z nich bezpośrednio (get
zasada działa przy próbie pobrania pojedynczego dokumentu, ale nie w przypadku umieszczania ich w kolekcji).
EDYCJA 2: Wygląda na to, że zgodnie z @MikeMcDonald moje oczekiwania były poprawne, ale obecnie są błędne. Oczekiwanie na naprawę.
EDIT 3: To jest teraz działa poprawnie z zasadami, aby uzyskać i wykazu zawartego w ten sposób:
allow get, list: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN';
Należy zauważyć, że 'write' jest nadzbiorem' update', więc twoja obecnie 'write' reguła nadpisuje' update'. Zmień go na "create", a będziesz bardziej zbliżyć się do zamierzonego celu. –
@MikeMcDonald dzięki, zrobię to. Zauważyłem również (po przeczytaniu trochę bliżej), że istnieją dwa "odczyty". 'get' i' list' później Spróbuję zezwolić na szerszą listę, może to coś, czego potrzebuję. Dzięki! – Monku
'read' jest parasolem zawierającym' get' i 'list'. Potwierdziłem, że powyższe jest błędem - powinno działać, ale nie obsługujemy tutaj poprawnie członków tablic. Sprawdzę tutaj, gdy poprawka zostanie usunięta. –