Как разрешить пользователям Firebase доступ только к тем документам, которые они создали - PullRequest
0 голосов
/ 05 октября 2019

Для меня это самая простая схема аутентификации для пользовательского контента, учитывая коллекцию под названием "posts":

  1. Разрешить любому аутентифицированному пользователю вставлять в коллекцию "posts"
  2. Разрешить пользователю, вставившему документ в «посты» коллекции, читать, обновлять и уничтожать документ, а также запрещать всем остальным
  3. Разрешать пользователю перечислять все документы в «постах» коллекции, еслиименно они создавали документы изначально

Все примеры, которые я обнаружил до сих пор, основаны на том, что идентификатор документа совпадает с идентификатором пользователя, что будет работать только для "профиля" пользователяданные (опять же, все примеры, кажется, для этого единственного ограниченного сценария).

Не похоже, что существуют какие-либо метаданные для того, кем был аутентифицированный пользователь, когда был создан документ, поэтому мне кажется, что я должен сохранить ID на документе самостоятельно, но я не смогчтобы пройти этот пункт и создать рабочий пример. Кроме того, это открывает возможность для пользователя создавать документы как другие пользователи, так как идентификатор пользователя устанавливается клиентом.

Мне кажется, что я здесь упускаю что-то фундаментальное, так как это должен быть самый базовый сценарий, но пока не нашел каких-либо кратких примеров для этого.

Любая помощь очень ценится, спасибо!

1 Ответ

1 голос
/ 05 октября 2019

Этот ответ из этого github gist . По сути, в сообщениях коллекции документов есть поле с именем uid, и оно проверяет, соответствует ли оно пользовательскому uid.

// Checks auth uid equals database node uid
// In other words, the User can only access their own data

{
  "rules": {
    "posts": {
       "$uid": {
         ".read": "$uid === auth.uid",
         ".write": "$uid === auth.uid"
       }
     }
   }
}

- Правка -

Правила DSL

match /Posts/{document=**}{
    allow read : if uid == request.auth.uid;
    allow write: if uid == request.auth.uid;
}
...