Настройка правила безопасности пользователя Firestore - PullRequest
0 голосов
/ 25 апреля 2019

Я новичок в Firestore и пытаюсь настроить простые правила безопасности, чтобы только тот, кто вошел в систему, мог создать новую запись в базе данных, а пользователи могли только читать и записывать свои собственные записи.

service cloud.firestore {
  match /databases/{database}/documents {
    match /Users/{userID} {

      // Can only create a new entry if signed in with a uid. 
      allow create: if request.auth.uid != null;

      // Can only update an entry if signed in with uid and changing own information (saved under uid)
      allow update: if request.auth.uid != null &&
        userID == request.auth.uid;

      // Can only read (get/list) an entry if signed in with uid and reading own information (saved under uid)
      allow read: if request.auth.uid != null &&
        resource.data.userID == request.auth.uid;
}

} }

Создание новой записи отлично работает, но мне интересно, достаточно ли это безопасно.

Для обновления и чтения я также хочу убедиться, что пользователь обновляет / читает свою собственную запись. Имя документа - это идентификатор пользователя (другими словами, UserID) из Firebase, поэтому простая проверка того, что request.auth.uid - то же самое, должна сработать, но что-то не так, как я пишу. Звонок блокируется, и когда я запускаю его в симуляторе, я получаю сообщение об ошибке: отсутствуют или недостаточно разрешений. Я не могу понять после просмотра документации и этого обучающего видео .

1 Ответ

1 голос
/ 25 апреля 2019

Что-то вроде ниже должно быть достаточно для вашей ситуации:

// True if the user is signed in or the requested data is 'public'
function signedInOrPublic() {
  return request.auth.uid != null || resource.data.visibility == 'public';
}

// Make sure the uid of the requesting user matches name of the user
// document. The wildcard expression {userId} makes the userId variable
// available in rules.
match /users/{userId} {
  allow read, update, delete: if request.auth.uid == userId;
  allow create: if signedInOrPublic();
}
...