Cloud Firestore Rules: что не так с этими правилами для многопользовательского доступа на основе ролей - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть коллекция событий и коллекция пользователей. Есть 2 типа пользователей. Админ и Стандарт. Стандартные пользователи имеют объявление в качестве родителя. Для каждого события в коллекции событий мне нужно дать разрешение на чтение, запись, обновление или удаление, если он является администратором этого события или обычным пользователем этого события.

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

   function isAdminForEvent() {
        return request.auth.uid == resource.data.uid;
   }
   function isStandardUserForEvent() {
   return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.parent_uid == resource.data.uid;
   }
    match /events/{eventID}/{document=**} {
      allow read,create,update,delete: if isAdminForEvent() || isStandardUserForEvent();
    }

    match /users/{userID} {
        allow read, write: if true;
    }
  }
}

Симулятор работает нормально , но на реальном устройстве разрешено только чтение. Ни обычный пользователь, ни администратор не могут выполнять операции записи.

1 Ответ

0 голосов
/ 18 апреля 2020

Важно отметить, что если ваши правила приводят к исключению, тогда вся операция будет отклонена.

Также обратите внимание, что resource.data - это данные перед записью и request.resource.data - это данные после записи.

function isStandardUserForEvent() {
  return exists(/databases/$(database)/documents/users/$(request.auth.uid))
      && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.parent_uid == resource.data.uid;
}

match /events/{eventID}/{document=**} {
  allow read,update,delete: if isAdminForEvent() || isStandardUserForEvent();
  allow create: if request.auth.uid == request.resource.data.uid;
}
...