Cloud Storage 用の Firebase セキュリティ ルール リファレンス

Cloud StorageFirebase Security Rules は、読み取りと書き込みのアクセス権を持つユーザーの判別に使用されます。 ファイルの構造と構造を Cloud Storage に保存されたファイルのみに適用 メタデータを定義します。Cloud Storage Security Rules は次のルールで構成されます。 requestresource は、次のような目的のアクションを許可または拒否するために使用できます。 アップロードやファイルメタデータの取得などの 操作を自動化できますこれらのリファレンス ドキュメントでは、 ルールの種類、requestresource のプロパティ、 Cloud Storage Security Rules で使用されるタイプ、エラーの発生方法。

ルール

rule は、request が一致しているかどうかを判定するために評価される式です。 ユーザーに付与します。

許可

allow ルールは、readwrite などのメソッドと、 オプションの条件ですルールの実行時に条件が評価され、 条件が true と評価された場合、目的のメソッドが許可されます。それ以外の場合 拒否されます。条件のない allow ルールでは、常に 選択します。

// Always allow method
allow <method>;

// Allow method if condition is true
allow <method>: if <condition>;

現在サポートされているルールは、allow のみです。

リクエストのメソッド

Read

read メソッドは、ファイルデータまたはメタデータを読み取るすべてのリクエストを対象としています。 これには、ファイルのダウンロードやファイルのメタデータの読み取りも含まれます。

// Always allow reads
allow read;

// Allow reads if condition evaluates to true
allow read: if <condition>;

Write

write メソッドは、ファイルデータまたはメタデータが書き込まれるすべてのリクエストに対応します。 これには、ファイルのアップロード、ファイルの削除、ファイルのメタデータの更新が含まれます。

// Always allow writes
allow write;

// Allow writes if condition evaluates to true
allow write: if <condition>;

一致

ユーザーが request(ファイルのアップロードやダウンロードなど)を行うと、ルールが実行されます ルールの対象となるファイルパスに一致します。match はパスと本文で構成され、 少なくとも 1 つの allow ルールが含まれている必要があります。一致するパスがない場合、リクエストは 拒否されます

完全な名前のパスを match にすることも、ワイルドカードを挿入してすべての 自動的に特定されます。

パスセグメント

single_segment

単一パスのセグメントを使用すると、保存されているファイルに一致するルールを作成できます。 (Cloud Storage

// Allow read at "path" if condition evaluates to true
match /path {
  allow read: if <condition>;
}

複数のパスセグメントやネストされたパスも使用できます。

// Allow read at "path/to/object" if condition evaluates to true
match /path {
  match /to {
    match /object {
      allow read: if <condition>;
    }
  }
}

{single_segment_wildcard}

同じパスにある複数のファイルにルールを適用する場合は、 ワイルドカード パス セグメントを使用して、特定のパスにあるすべてのファイルを照合します。ワイルドカード変数 変数を中かっこで囲むことで、パス内で宣言できます({variable})。 この変数は、match ステートメント内で string としてアクセスできます。

// Allow read at any path "/*", if condition evaluates to true
match /{single_path} {
  // Matches "path", "to", or "object" but not "path/to/object"
  allow read: if <condition>;
}

複数のパスセグメントやネストされたパスにもワイルドカードを使用できます。

// Allow read at any path "/path/*/newPath/*", if condition evaluates to true
match /path/{first_wildcard} {
  match /newPath/{second_wildcard} {
    // Matches "path/to/newPath/newObject" or "path/from/newPath/oldObject"
    allow read: if <condition>;
  }
}

{multi_segment_wildcard=**}

パスまたはその下位にある任意の数のパスセグメントを照合する場合は、 マルチセグメントのワイルドカード。このワイルドカードは、 あります。これは、ユーザーに独自の自由形式を提供する場合に便利です。 さまざまなパス セグメント( 公開読み取り可能なファイル セットを作成したり、 すべての書き込み)。

マルチセグメントのワイルドカード パスは、単一セグメントと同様に宣言します ワイルドカードを使用します。変数の末尾に =** を追加します。 {variable=**}。一致内ではマルチセグメントのワイルドカード変数を使用できます。 ステートメントを path オブジェクトとして記述します。

// Allow read at any path "/**", if condition evaluates to true
match /{multi_path=**} {
  // Matches anything at or below this, from "path", "path/to", "path/to/object", ...
  allow read: if <condition>;
}

リクエスト

request 変数は、状態を表す条件内で指定します。 表示されます。request 変数には複数の値があります。 プロパティを使用して、受信リクエストを許可するかどうかを決定できます。

プロパティ

auth

認証されたユーザーが Cloud Storage に対してリクエストを実行すると、 auth 変数には、ユーザーの uidrequest.auth.uid)が次のように入力されます。 Firebase Authentication JWT(request.auth.token)のクレームが含まれています。

request.auth.token には、次のキーの一部またはすべてが含まれています。

フィールド 説明
email アカウントに関連付けられているメールアドレス(存在する場合)。
email_verified ユーザーに email アドレスへのアクセス権があることが確認された場合は true。一部のプロバイダは、そのプロバイダが所有するメールアドレスを自動的に確認します。
phone_number アカウントに関連付けられている電話番号(存在する場合)。
name ユーザーの表示名(設定されている場合)。
sub ユーザーの Firebase UID。これはプロジェクト内で一意です。
firebase.identities このユーザーのアカウントに関連付けられているすべての ID の辞書。辞書のキーは、emailphonegoogle.comfacebook.comgithub.comtwitter.com のいずれかです。辞書の値は、アカウントに関連付けられている各 ID プロバイダの一意の識別子からなる配列です。たとえば、auth.token.firebase.identities["google.com"][0] にはアカウントに関連付けられている最初の Google ユーザー ID が含まれます。
firebase.sign_in_provider このトークンを取得するために使用されたログイン プロバイダ。custompasswordphoneanonymousgoogle.comfacebook.comgithub.comtwitter.com のいずれかの文字列です。
firebase.tenant 存在する場合、アカウントに関連付けられている tenantId(例: tenant2-m6tyz)。

カスタム認証を使用する場合、request.auth.token にはカスタム認証も デベロッパーが指定した申し立てです。

認証されていないユーザーがリクエストを実行すると、request.authnull になります。

// Allow requests from authenticated users
allow read, write: if request.auth != null;

path

path 変数には、request が実行されているパスが含まれます。 対抗できます。

// Allow a request if the first path segment equals "images"
allow read, write: if request.path[0] == 'images';

resource

resource 変数には、アップロードするファイルのメタデータまたは 既存のファイルのメタデータを更新します。これは resource 変数。これには現在のファイル メタデータが含まれます。 要求されたパスだけを渡さなければなりません。

// Allow a request if the new value is smaller than 5MB
allow read, write: if request.resource.size < 5 * 1024 * 1024;

request.resource には、resource の次のプロパティが含まれます。

プロパティ
name
bucket
metadata
size
contentType

time

time 変数には、現在のサーバー時間を表すタイムスタンプが含まれます。 リクエストの評価の基準となります。これを使用して時間ベースのアクセスを たとえば、特定の日付までファイルのアップロードを許可したり、 アップロードしてから 1 時間以内でファイルを読み取れるようにしたりできます。

// Allow a read if the file was created less than one hour ago
allow read: if request.time < resource.timeCreated + duration.value(1, 'h');

タイムスタンプdurations です。

リソース

resource 変数には、フォルダ内のファイルのメタデータが含まれます。 Cloud Storage(ファイル名、サイズ、作成時間、 カスタム メタデータを設定します。

プロパティ

name

ファイルの完全な名前(ファイルのパスを含む)を含む文字列。

// Allow reads if the resource name is "path/to/object"
allow read: if resource.name == 'path/to/object'

bucket

Google Cloud Storage を含む文字列 バケットにこのファイルが保存されます。

// Allow reads of all resources in your bucket
allow read: if resource.bucket == '<your-cloud-storage-bucket>'

generation

Google Cloud Storage を含む int オブジェクト生成 表示されます。オブジェクトのバージョニングで使用されます。

// Allow reads if the resource matches a known object version
allow read: if resource.generation == <known-generation>

metageneration

Google Cloud Storage を含む int オブジェクトのメタ生成 表示されます。オブジェクトのバージョニングで使用されます。

// Allow reads if the resource matches a known object metadata version
allow read: if resource.metageneration == <known-generation>

size

ファイルサイズ(バイト単位)を含む int。

// Allow reads if the resource is less than 10 MB
allow read: if resource.size < 10 * 1024 * 1024;

timeCreated

ファイルの作成日時を表すタイムスタンプ。

// Allow reads if the resource was created less than an hour ago
allow read: if resource.timeCreated < request.time + duration.value(60, "m")

updated

ファイルの最終更新日を表すタイムスタンプ。

// Allow reads if the resource was updated less than an hour ago
allow read: if resource.updated < request.time + duration.value(60, "m")

md5Hash

パケットの MD5 ハッシュを含む文字列 表示されます。

// Allow writes if the hash of the uploaded file is the same as the existing file
allow write: if request.resource.md5Hash == resource.md5Hash;

crc32c

次を含む文字列 crc32c ハッシュ: 表示されます。

// Allow writes if the hash of the uploaded file is the same as the existing file
allow write: if request.resource.crc32c == resource.crc32c;

etag

アプリケーションの etag を含む文字列 表示されます。

// Allow writes if the etag matches a known object etag
allow write: if resource.etag == <known-generation>

contentDisposition

ファイルのコンテンツ処理を含む文字列。

// Allow reads if the content disposition matches a certain value
allow read: if resource.contentDisposition == 'inlined';

contentEncoding

ファイルのコンテンツ エンコードを含む文字列。

// Allow reads if the content is encoded with gzip
allow read: if resource.contentEncoding == 'gzip';

contentLanguage

ファイルのコンテンツ言語を含む文字列。

// Allow reads if the content language is Japanese
allow read: if resource.contentLanguage == 'ja';

contentType

ファイルのコンテンツ タイプを含む文字列。

// Allow reads if the content type is PNG.
allow read: if resource.contentType == 'image/png';

metadata

デベロッパーが提供する追加のメタデータを含む Map<String, String> 表示されます。

// Allow reads if a certain metadata field matches a desired value
allow read: if resource.metadata.customProperty == 'customValue';

firestore.get と firestore.exists

firestore.get() 関数と firestore.exists() 関数を使用すると、 複雑な承認基準を評価するために、Cloud Firestore にドキュメントが含まれています。

firestore.get() 関数と firestore.exists() 関数はどちらも ドキュメント パスを指定します。変数を使用して Pod の firestore.get()firestore.exists() は、 $(variable) 構文を使って変数を宣言します。

firestore.get

Cloud Firestore ドキュメントのコンテンツを取得します。

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{club}/files/{fileId} {
      allow read: if club in
        firestore.get(/databases/(default)/documents/users/$(request.auth.uid)).data.memberships
    }
  }
}

Firestore.exists

Cloud Firestore ドキュメントが存在するかどうかを確認します。

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{userId}/photos/{fileId} {
      allow read: if
        firestore.exists(/databases/(default)/documents/users/$(userId)/friends/$(request.auth.uid))
    }
  }
}

サービス

serviceCloud Storage Security Rules ファイル内の最初の宣言であり、かつ これらのルールを適用するサービスを指定します。

名前

name

サービスルールの名前が適用されます。現在の値は firebase.storage

// Specify the service name
service firebase.storage {
  match /b/{bucket}/o {
    ...
  }
}

Data Types

Rules 言語では、is 演算子を使用して型を確認できます。

// For example
a is null
a is string

null

null データ型は存在しない値を表します。

allow read: if request.auth != null;

bool

bool 型は、ブール値 true または false の値を表します。

allow read: if true;   // always succeeds
allow write: if false; // always fails

比較

ブール値は、== 演算子 != を使用して比較できます。

ブール演算

オペレーション
AND x && y
OR x || y
NOT !x

オペレーションが短絡し、truefalse、または エラー

allow read: if true || false;   // always succeeds, short circuits at true
allow write: if false && true; // always fails, short circuits at false

intfloat

int 型と float 型は数値を表します。整数: 01-2 など 、浮動小数点数: 1.0-2.03.33 など

int は符号付き 64 ビット値、float は 64 ビット IEEE 754 準拠値です。 比較で使用する場合、int 型の値は float に強制変換されます float 値を持つ算術演算。

比較

整数と浮動小数点数は、==!=><>=<= 演算子。

算術

整数と浮動小数点数は、加算、減算、乗算、除算、剰余計算、 negated:

オペレーション
加算 x + y
減算 x - y
乗算 x * y
除算 x / y
剰余 x % y
否定 -x

数学関数

Cloud StorageFirebase Security Rules には、さまざまな数学ヘルパーも用意されています。 関数を使用して、式を簡素化できます。

関数 説明
math.ceil(x) 数値の上限
math.floor(x) 数値の下限
math.round(x) 入力値を最も近い整数に丸める
math.abs(x) 入力の絶対値
math.isInfinite(x) 値が ±∞ かどうかをテストし、bool を返します。
math.isNaN(x) 値が数値 NaN でないかどうかをテストし、bool を返します。

string

比較

文字列は、==!=><>=<= 演算子。

連結

文字列は + 演算子を使用して連結できます。

// Concatenate a file name and extension
'file' + '.txt'

インデックスと範囲

index 演算子 string[] は、次の文字を含む文字列を返します。 文字列の指定されたインデックスに配置されます。

// Allow reads of files that begin with 'a'
match /{fileName} {
  allow read: if fileName[0] == 'a';
}

range 演算子 string[i:j] は、「 指定インデックス間の文字。i(両端を含む)から j まで (排他)。i または j が指定されていない場合は、デフォルトで 0 に設定され、 それぞれ文字列。ただし、少なくとも i または j を指定する必要があります。 指定する必要があります。

// Allow reads of files that begin with 'abcdef'
match /{fileName} {
  allow read: if fileName[0:6] == 'abcdef';
}

インデックスが指定されている場合、index 演算子と range 演算子はエラーになります 超えています。

size

文字列の文字数を返します。

// Allow files with names less than 10 characters
match /{fileName} {
  allow write: if fileName.size() < 10;
}

matches

正規表現の一致を行います。文字列がtrue 照合できます。用途 Google RE2 構文

// Allow writes to files which end in ".txt"
match /{fileName} {
  allow write: if fileName.matches('.*\\.txt')
}

split

指定された正規表現に従って文字列を分割し、list を返します。 使用します。Google RE2 構文を使用します。

// Allow files named "file.*" to be uploaded
match /{fileName} {
  allow write: if fileName.split('.*\\..*')[0] == 'file'
}

path

パスはディレクトリに似た名前で、オプションでパターン マッチングを使用できます。「 スラッシュ / が存在する場合は、パスセグメントの開始を示します。

path

string 引数を path に変換します。

// Allow reads on a specific file path
match /{allFiles=**} {
  allow read: if allFiles == path('/path/to/file');
}

timestamp

タイムスタンプは UTC で、有効な値は 0001-01-01T00.00.00Z から始まります。 末尾は 9999-12-31T23.59.59Z です。

比較

タイムスタンプは、==!=><>=<= 演算子。

算術

タイムスタンプは、次のようにタイムスタンプと期間の間の加算と減算をサポートします。 次のようになります。

結果
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

date

yearmonthday のみを含む timestamp 値。

// Allow reads on the same day that the resource was created.
allow read: if request.time.date() == resource.timeCreated.date()

year

int で表した年の値(1 ~ 9999)。

// Allow reads on all requests made before 2017
allow read: if request.time.year() < 2017

month

int で表した月の値(1 ~ 12)。

// Allow reads on all requests made during the month of January
allow read: if request.time.month() == 1;

day

現在の日付を整数で表した、1 ~ 31。

// Allow reads on all requests made during the first day of each month
allow read: if request.time.day() == 1;

time

現在の時刻を含む duration 値。

// Allow reads on all requests made before 12PM
allow read: if request.time.time() < duration.time(12, 0, 0, 0);

hours

整数で表した時間の値(0 ~ 23)。

// Allow reads on all requests made before 12PM
allow read: if request.time.hours() < 12;

minutes

int で表した分の値(0 ~ 59)。

// Allow reads during even minutes of every hour
allow read: if request.time.minutes() % 2 == 0;

seconds

秒の値(整数)。0 ~ 59 です。

// Allow reads during the second half of each minute
allow read: if request.time.seconds() > 29;

nanos

秒の小数点以下(ナノ秒単位)。整数

// Allow reads during the first 0.1 seconds of each second
allow read: if request.time.nanos() < 100000000;

dayOfWeek

1(月曜日)から 7(日曜日)までの曜日。

// Allow reads on weekdays (Monday to Friday)
allow read: if request.time.dayOfWeek() < 6;

dayOfYear

今年の日付(1 ~ 366)。

// Allow reads every fourth day
allow read: if request.time.dayOfYear() % 4 == 0;

toMillis

Unix エポック時刻から現在経過したミリ秒数を返します。

// Allow reads if the request is made before a specified time
allow read: if request.time.toMillis() < <milliseconds>;

duration

Duration 値は、秒単位と、小数点以下の秒数で表します。 ナノ秒。

比較

時間の比較と並べ替えには、==!=><>=<= 演算子。

算術

Durations は、次のようにタイムスタンプと期間の間の加算と減算をサポートします。 次のようになります。

結果
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

seconds

現在の期間の秒数。-315,576,000,000 の範囲で指定してください +315,576,000,000 になります。

nanos

現在の期間の小数点以下の秒数(ナノ秒単位)。必須 -999,999,999 ~+999,999,999 の範囲である必要があります。0 以外の秒と 両方の記号が一致している必要があります。

duration.value

期間を作成するには、duration.value(int magnitude, string units) を使用します。 この関数は、指定された大きさと単位から期間を作成します。

// All of these durations represent one hour:
duration.value(1, "h")
duration.value(60, "m")
duration.value(3600, "s")

考えられる unit は次のとおりです。

所要時間 unit
w
d
時間 h
m
s
ミリ秒 ms
ナノ秒 ns

duration.time

長さは、 duration.time(int hours, int minutes, int seconds, int nanoseconds) 関数、 これは、指定された時間、分、秒、 ナノ秒。

// Create a four hour, three minute, two second, one nanosecond duration
duration.time(4, 3, 2, 1)

list

リストには、値の順序付き配列が含まれます。配列の型は nullboolintfloatstringpathlistmaptimestampduration のいずれかです。

list 型の xyint 型の ij が与えられている

作成

リストを作成するには、角かっこ内に値を追加します。

// Create a list of strings
['apples', 'grapes', 'bananas', 'cheese', 'goats']

比較

リストは、== 演算子 != を使用して比較できます。2 つのリストの等価性 すべての値が同じである必要があります。

インデックスと範囲

index 演算子 list[] は、指定されたインデックスにあるアイテムを 選択します。

// Allow reads of all files that begin with 'a'
match /{fileName} {
  allow read: if fileName[0] == 'a';
}

range 演算子 list[i:j] は、 i から j まで(この値を含まない)。指定インデックス数。i または j が 指定しない場合のデフォルトはそれぞれ 0 とリストのサイズになりますが、 範囲を有効にするには、少なくとも i または j を指定する必要があります。

// Allow reads of all files that begin with 'abcdef'
match /{fileName} {
  allow read: if fileName[0:6] == 'abcdef';
}

in

目的の値がリスト内に存在する場合は true を返し、存在しない場合は false を返します。 できます。

// Allow read if a filename has the string 'txt' in it
match /{fileName} {
  allow read: if 'txt' in fileName.split('\\.');
}

join

文字列のリストを、指定された文字列で区切られた 1 つの文字列に結合します。

// Allow reads if the joined array is 'file.txt'
allow read: if ['file', 'txt'].join('.') == 'file.txt';

size

リスト内のアイテム数。

// Allow read if there are three items in our list
allow read: if ['foo', 'bar', 'baz'].size() == 3;

hasAll

すべての値がリストに存在する場合は true を返します。

// Allow read if one list has all items in the other list
allow read: if ['file', 'txt'].hasAll(['file', 'txt']);

map

マップには Key-Value ペアが含まれます。キーは文字列、値は任意のものになります。 /: nullboolintfloatstringpathlistmaptimestampduration などがあります。

作成

マップを作成するには、中かっこの間に Key-Value ペアを追加します。

// Create a map of strings to strings
{
  'mercury': 'mars',
  'rain': 'cloud',
  'cats': 'dogs',
}

比較

== 演算子 != を使用して地図を比較できます。2 つの地図の等価性 すべてのキーがマップの両方に存在し、すべての値が同じである必要があります。

インデックス

マップ内の値にアクセスするには、かっこまたはドット表記を使用します。

// Access custom metadata properties
allow read: if resource.metadata.property == 'property'
allow write: if resource.metadata['otherProperty'] == 'otherProperty'

キーが存在しない場合は、error が返されます。

in

目的のキーがマップ内に存在する場合は true を返し、存在しない場合は false を返します。 できます。

// Allow reads if a property is present in the custom metadata
allow read: if property in resource.metadata;

size

マップ内のキーの数。

// Allow reads if there's exactly one custom metadata key
allow read: if resource.metadata.size() == 1;

keys

マップ内のすべてのキーのリスト。

// Allow reads if the first metadata key is 'myKey'
allow read: if resource.metadata.keys()[0] == 'myKey';

values

マップ内のすべての値のリスト(キー順)。

// Allow reads if the first metadata value is 'myValue'
allow read: if resource.metadata.values()[0] == 'myValue';

エラー

エラーの評価

Cloud StorageFirebase Security Rules は、エラーが発生した場合に評価を続行します。 条件付き && 式と || 式によってエラーが取り込まれる可能性があるため、これは便利です。 条件文が false または true に短絡するかどうか できます。次に例を示します。

結果
error && true error
error && false false
error || true true
error || false error

エラーがよく発生する場所: ゼロ除算、値へのアクセス リストまたはマップ内に存在せず、誤った型の値を渡しています できます。

// Error if resource.size is zero
allow read: if 1000000 / resource.size;

// Error, key doesn't exist
allow read: if resource.metadata.nonExistentKey == 'value';

// Error, no unit 'y' exists
allow read: if request.time < resource.timeCreated + duration.value(1, 'y');