Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

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

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

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

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

Объявление службы и базы данных

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

service firebase.storage {
    // ...
}

Объявление service firebase.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} .

В приведенном выше примере оператор match использует синтаксис подстановочного знака {imageId} . Это означает, что правило применяется к любому файлу с /images/ в начале имени, например /images/profilePhoto.png или /images/croppedProfilePhoto.png . Когда выражения allow в операторе match оцениваются, переменная 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 оценивается как истинное, в то время как файл «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

В версии 2 правил безопасности Firebase рекурсивные подстановочные знаки соответствуют нулю или более элементам пути. Таким образом, /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 . В true , когда запросу соответствует несколько allow выражений, доступ разрешается, если выполняется любое из условий:

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, характерные для облачного хранилища: