Правила безопасности Firestore - Как ограничить пользователей чтением только определенных документов? - PullRequest
0 голосов
/ 30 мая 2019

Я хочу отображать общедоступную информацию о пользователях в виде, но я не хочу, чтобы пользователь мог get () список всех пользователей в моем / users / {userID} / public collection.Я знаю, что могу ограничить доступ, чтобы можно было просматривать только коллекцию public .Но это также позволило бы кому-нибудь очистить всю базу данных, чтобы увидеть всех публичных пользователей.

Какие правила я мог бы использовать, чтобы ограничить доступ, чтобы указать конкретный документ?Например:

db.collection('users').get()

Будет отказано.Но:

db.collection('users').doc('abc123').collection('public').get()

... будет успешным.

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Я только что понял, что вроде как ответил на свой вопрос. Вы можете просто предоставить доступ на чтение своим пользователям public sub-collection, но заблокировать доступ к определенному user doc.

Для тех, кто гуглит здесь позже, что-то вроде этого:

service cloud.firestore {
    match /databases/{database}/documents {
        match /users/{userID} {
            allow read, write, delete: if isAdmin();

            match /public/{publicID} {
                allow read: if request.auth.uid != null;
            }
        }
    }
}
0 голосов
/ 30 мая 2019

В отношениях между / users / x и / users / x / public нет ничего такого, что затрудняло бы их отдельную защиту.Это совершенно разные коллекции и могут быть защищены отдельно без конфликтов.Единственный раз, когда у вас возникнет проблема, это если вы решите использовать подстановочный знак глобуса, который обычно не используется.

Если вы не укажете какое-либо правило для / users, тогда доступ не будет разрешен.Правило для вашего первого запроса - просто не писать правила.(Если вы не хотите, чтобы пользователи читали свой отдельный документ, просто напишите это правило, и оно все равно также не позволит никому получить список пользователей.)

Правило для вашего второго запроса можно включить для всех, простозаписав:

match /users/{uid}/public/{id} {
  allow read;
}

Это правило не повлияет сразу на документы в / users, поскольку они не соответствуют шаблону.И любое другое правило, которое соответствует / users / {uid}, не повлияет ни на одну вложенную коллекцию по той же причине - нет соответствия.

...