Правила безопасности Firebase - использование функции get - PullRequest
0 голосов
/ 16 декабря 2018

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

  1. Пользователь должен аутентифицироваться для чтения
  2. Владельцы документов - единственные, ктоможет написать им (используйте поле с именем владельца в документе для проверки)
  3. Любой пользователь-администратор также может написать в любой документ

Приведенный ниже код выполняет все это (исключая проверкудля владельца), но функция get для определения роли пользователей работает только в том случае, если она указана в той же строке, что и условие if.В приведенном ниже коде обновление и удаление работает для администратора, но не для создания.

Может кто-нибудь сказать, почему функция isAdmin () не дает такой же результат?

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

    // Only 'owners' of data can make changes to data
    match /posts/{post} {    
      allow read: if isAuthenticated();
      allow create: if isAuthenticated() && isAdmin();
      allow update, delete: if isAuthenticated() && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 1;      
    }
  } 

  /// FUNCTIONS ///
  function isAuthenticated() {
     return request.auth.uid != null;
  }

  // function requestIsOwner() {
  //   return request.resource.data.owner == request.auth.uid;
  // }

  // function resourceIsOwner() {
  //   return resource.data.owner == request.auth.uid;
  // }

  function isAdmin() {
    return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 1
  }
}

1 Ответ

0 голосов
/ 17 декабря 2018

Вам необходимо передать переменную database в качестве аргумента в вашей функции следующим образом:

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

    // Only 'owners' of data can make changes to data
    match /posts/{post} {    
      allow read: if isAuthenticated();
      allow create: if isAuthenticated() && isAdmin(database);
      allow update, delete: if isAuthenticated() && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 1;      
    }
  } 

  /// FUNCTIONS ///
  function isAuthenticated() {
     return request.auth.uid != null;
  }

  // function requestIsOwner() {
  //   return request.resource.data.owner == request.auth.uid;
  // }

  // function resourceIsOwner() {
  //   return resource.data.owner == request.auth.uid;
  // }

  function isAdmin(database) {
    return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 1
  }
}
...