правила безопасности firebase проверяют 2 поля в данных - PullRequest
0 голосов
/ 25 февраля 2019

в соответствии с функциями docs не может создавать переменные, но мне нужно проверить два поля на наличие разрешений на запись в моей коллекции companies.У меня есть documentId, хранящийся в моем user документе как company_slug

Так что правило № 1 для match /companies/{company} { allow write: ... }:

get(/databases/$(database)/documents/users/$(request.auth.uid)).data.company_slug == company

Это хорошо для доступа на чтение, но мне нужно проверитьuser.level (1 для администратора, 2-n для других уровней) независимо от того, в порядке ли запись.

, поэтому правило № 2 будет

get(/databases/$(database)/documents/users/$(request.auth.uid)).data.level == 1

Таким образом, полное правило будетбыть:

match /companies/{company} {
          allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.company_slug == company;
          allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.company_slug == company && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.level == 1;
}

Что кажется очень громоздким и также «обойдется» мне 2 чтения и 1 запись для каждого отправленного запроса на запись, не так ли?

Есть ли способоптимизируйте это, так как это кажется очень сложным для поддержки по мере роста приложения.

1 Ответ

0 голосов
/ 25 февраля 2019

Вы можете использовать Настраиваемые утверждения для реализации ваших требований безопасности.

Вы можете назначить два разных утверждения каждому пользователю:

companyId

и

userLevel (1, 2, 3 и т. Д.)

и ваши правила будут выглядеть следующим образом:

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

    function userIsLevel1() {
        return (request.auth.uid != null) && (request.auth.token.userLevel == 1);
    }

    function isCorrectCompany(company) {
        return request.auth.token.companyId == company;
    }

    match /companies/{company} {
          allow read: if isCorrectCompany(company);
          allow write: if isCorrectCompany(company) && userIsLevel1();
    }

}

Одним из ключевых преимуществ использования пользовательских утверждений является то, что вам не нужночитать один или несколько документов Firestore для каждой проверки Правил безопасности.

Вы можете посмотреть это официальное видео Firebase, начиная с 17:49: https://www.youtube.com/watch?v=eW5MdE3ZcAw

...