Изучите основной синтаксис правил безопасности Firebase для языка Cloud Storage.

Правила безопасности Firebase для Cloud Storage позволяют вам контролировать доступ к объектам, хранящимся в сегментах Cloud Storage. Гибкий синтаксис правил позволяет создавать правила для управления любой операцией — от всех операций записи в корзину Cloud Storage до операций с конкретным файлом.

В этом руководстве описываются базовый синтаксис и структура правил безопасности облачного хранилища для создания полных наборов правил.

Декларация службы и базы данных

Правила безопасности Firebase для облачного хранилища всегда начинаются со следующего объявления:

service firebase.storage {
    // ...
}

Объявление service firebase.storage распространяет правила на Cloud Storage, предотвращая конфликты между правилами безопасности Cloud Storage и правилами для других продуктов, таких как Cloud Firestore.

Основные правила чтения/записи

Основные правила состоят из оператора match , определяющего сегменты Cloud Storage, оператора сопоставления, определяющего имя файла, и выражения allow , указывающего, когда разрешено чтение указанных данных. Выражения allow определяют используемые методы доступа (например, чтение, запись), а также условия , при которых доступ либо разрешается, либо запрещается.

В наборе правил по умолчанию первый match сопоставления использует подстановочное выражение {bucket} , чтобы указать, что правила применяются ко всем сегментам в вашем проекте. Мы подробнее обсудим идею совпадений с подстановочными знаками в следующем разделе.

service firebase.storage {
  // The {bucket} wildcard indicates we match files in all Cloud Storage buckets
  match /b/{bucket}/o {
    // Match filename
    match /filename {
      allow read: if <condition>;
      allow write: if <condition>;
    }
  }
}

Все операторы сопоставления указывают на файлы. Оператор match может указывать на конкретный файл, как в match /images/profilePhoto.png .

Подстановочные знаки соответствия

Помимо указания на один файл, правила могут использовать подстановочные знаки для указания на любой файл с заданным строковым префиксом в имени, включая косую черту, как в match /images/{imageId} .

В приведенном выше примере оператор сопоставления использует синтаксис подстановочного знака {imageId} . Это означает, что правило применяется к любому файлу с /images/ в начале имени, например /images/profilePhoto.png или /images/croppedProfilePhoto.png . При оценке allow выражений в операторе сопоставления переменная imageId преобразуется в имя файла изображения, например profilePhoto.png или croppedProfilePhoto.png .

Из match можно ссылаться на подстановочную переменную, чтобы указать имя файла или авторизацию пути:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

Иерархические данные

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

Рассмотрим ситуацию с набором файлов, имена которых начинаются с основы /images/ . Правила безопасности Firebase применяются только к соответствующему имени файла, поэтому элементы управления доступом, определенные в основе /images/ не применяются к основе /mp3s/ . Вместо этого напишите явные правила, соответствующие различным шаблонам имен файлов:

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      allow read, write: if <condition>;
    }

    // Explicitly define rules for the 'mp3s' pattern
    match /mp3s/{mp3Id} {
      allow read, write: if <condition>;
    }
  }
}

При вложении операторов match путь внутреннего match сопоставления всегда добавляется к пути внешнего оператора match . Таким образом, следующие два набора правил эквивалентны:

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Exact match for "images/profilePhoto.png"
      match /profilePhoto.png {
        allow write: if <condition>;
      }
    }
  }
}
service firebase.storage {
  match /b/{bucket}/o {
    // Exact match for "images/profilePhoto.png"
    match /images/profilePhoto.png {
      allow write: if <condition>;
      }
  }
}

Рекурсивные подстановочные знаки совпадений

В дополнение к подстановочным знакам, которые соответствуют строкам в конце имени файла и возвращают их, для более сложного сопоставления можно объявить многосегментный подстановочный знак , добавив =** к имени подстановочного знака, например {path=**} :

// Partial match for files that start with "images"
match /images {

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

Если файлу соответствует несколько правил, результатом является OR результата оценок всех правил. То есть, если какое-либо правило, которому соответствует файл, оценивается как true , результат будет true .

В приведенных выше правилах файл «images/profilePhoto.png» можно прочитать, если какое-либо condition или other_condition имеет значение true, тогда как файл «images/users/user:12345/profilePhoto.png» зависит только от результата other_condition . .

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

Версия 1

Правила безопасности Firebase по умолчанию используют версию 1. В версии 1 рекурсивные подстановочные знаки соответствуют одному или нескольким элементам имени файла, а не нулю или более элементам. Таким образом, match /images/{filenamePrefixWildcard}/{imageFilename=**} соответствует имени файла, например /images/profilePics/profile.png, но не /images/badge.png. Вместо этого используйте /images/{imagePrefixorFilename=**} .

Рекурсивные подстановочные знаки должны располагаться в конце оператора сопоставления.

Мы рекомендуем вам использовать версию 2 из-за ее более мощных функций.

Версия 2

В правилах безопасности Firebase версии 2 рекурсивные подстановочные знаки соответствуют нулю или более элементам пути. Таким образом, /images/{filenamePrefixWildcard}/{imageFilename=**} соответствует именам файлов /images/profilePics/profile.png и /images/badge.png.

Вы должны подписаться на версию 2, добавив rules_version = '2'; в верхней части правил безопасности:

rules_version = '2';
service cloud.storage {
  match /b/{bucket}/o {
   ...
 }
}

Вы можете использовать не более одного рекурсивного подстановочного знака для каждого оператора сопоставления, но в версии 2 вы можете разместить этот подстановочный знак в любом месте оператора сопоставления. Например:

rules_version = '2';
service firebase.storage {
 match /b/{bucket}/o {
   // Matches any file in a songs "subdirectory" under the
   // top level of your Cloud Storage bucket.
   match /{prefixSegment=**}/songs/{mp3filenames} {
     allow read, write: if <condition>;
   }
  }
}

Детальные операции

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

Операцию read можно разбить на get и list .

Правило write можно разбить на create , update и delete :

service firebase.storage {
  match /b/{bucket}/o {
    // A read rule can be divided into read and list rules
    match /images/{imageId} {
      // Applies to single file read requests
      allow get: if <condition>;
      // Applies to list and listAll requests (Rules Version 2)
      allow list: if <condition>;

    // A write rule can be divided into create, update, and delete rules
    match /images/{imageId} {
      // Applies to writes to file contents
      allow create: if <condition>;

      // Applies to updates to (pre-existing) file metadata
      allow update: if <condition>;

      // Applies to delete operations
      allow delete: if <condition>;
    }
  }
 }
}

Перекрывающиеся операторы сопоставления

Имя файла может соответствовать более чем одному match . В случае, когда запросу соответствует несколько выражений allow , доступ разрешается, если какое-либо из условий true :

service firebase.storage {
  match b/{bucket}/o {
    // Matches file names directly inside of '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches file names anywhere under `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

В приведенном выше примере все операции чтения и записи в файлы, имена которых начинаются с /images/ разрешены, поскольку второе правило всегда true , даже если первое правило false .

Правила — это не фильтры

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

Например, возьмем следующее правило безопасности:

service firebase.storage {
  match /b/{bucket}/o {
    // Allow the client to read files with contentType 'image/png'
    match /aFileNamePrefix/{aFileName} {
      allow read: if resource.contentType == 'image/png';
    }
  }
}

Отказано : это правило отклоняет следующий запрос, поскольку набор результатов может включать файлы, в которых contentType не равен image/png :

Интернет
filesRef = storage.ref().child("aFilenamePrefix");

filesRef.listAll()
    .then(function(result) {
      console.log("Success: ", result.items);
    })
});

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

Следующие шаги

Вы можете углубить свое понимание правил безопасности Firebase для облачного хранилища:

  • Изучите следующую важную концепцию языка правил — динамические условия , которые позволяют вашим правилам проверять авторизацию пользователя, сравнивать существующие и входящие данные, проверять входящие данные и многое другое.

  • Ознакомьтесь с типичными вариантами использования безопасности и определениями правил безопасности Firebase, которые их касаются .

Вы можете изучить варианты использования правил безопасности Firebase, специфичные для Cloud Storage: