Cloud Storage の Firebase Security Rules は、読み取りと書き込みのアクセス権を持つユーザーの判別に使用されます。
ファイルの構造と構造を Cloud Storage に保存されたファイルのみに適用
メタデータを定義します。Cloud Storage Security Rules は次のルールで構成されます。
request
と resource
は、次のような目的のアクションを許可または拒否するために使用できます。
アップロードやファイルメタデータの取得などの
操作を自動化できますこれらのリファレンス ドキュメントでは、
ルールの種類、request
と resource
のプロパティ、
Cloud Storage Security Rules で使用されるタイプ、エラーの発生方法。
ルール
rule
は、request
が一致しているかどうかを判定するために評価される式です。
ユーザーに付与します。
型
許可
allow
ルールは、read
や write
などのメソッドと、
オプションの条件ですルールの実行時に条件が評価され、
条件が 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
変数には、ユーザーの uid
(request.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 の辞書。辞書のキーは、email 、phone 、google.com 、facebook.com 、github.com 、twitter.com のいずれかです。辞書の値は、アカウントに関連付けられている各 ID プロバイダの一意の識別子からなる配列です。たとえば、auth.token.firebase.identities["google.com"][0] にはアカウントに関連付けられている最初の Google ユーザー ID が含まれます。 |
firebase.sign_in_provider |
このトークンを取得するために使用されたログイン プロバイダ。custom 、password 、phone 、anonymous 、google.com 、facebook.com 、github.com 、twitter.com のいずれかの文字列です。 |
firebase.tenant |
存在する場合、アカウントに関連付けられている tenantId(例: tenant2-m6tyz )。 |
カスタム認証を使用する場合、request.auth.token
にはカスタム認証も
デベロッパーが指定した申し立てです。
認証されていないユーザーがリクエストを実行すると、request.auth
は null
になります。
// 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');
リソース
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)) } } }
サービス
service
が Cloud 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 |
オペレーションが短絡し、true
、false
、または
エラー。
allow read: if true || false; // always succeeds, short circuits at true allow write: if false && true; // always fails, short circuits at false
int
と float
int
型と float
型は数値を表します。整数: 0
、1
、-2
など
、浮動小数点数: 1.0
、-2.0
、3.33
など
int は符号付き 64 ビット値、float は 64 ビット IEEE 754 準拠値です。
比較で使用する場合、int
型の値は float
に強制変換されます
float
値を持つ算術演算。
比較
整数と浮動小数点数は、==
、!=
、>
、<
、
>=
、<=
演算子。
算術
整数と浮動小数点数は、加算、減算、乗算、除算、剰余計算、 negated:
オペレーション | 式 |
---|---|
加算 | x + y |
減算 | x - y |
乗算 | x * y |
除算 | x / y |
剰余 | x % y |
否定 | -x |
数学関数
Cloud Storage の Firebase 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
year
、month
、day
のみを含む 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
リストには、値の順序付き配列が含まれます。配列の型は null
、bool
、
int
、float
、string
、path
、list
、map
、timestamp
、duration
のいずれかです。
list
型の x
と y
、int
型の i
と j
が与えられている
作成
リストを作成するには、角かっこ内に値を追加します。
// 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 ペアが含まれます。キーは文字列、値は任意のものになります。
/: null
、bool
、int
、float
、string
、path
、list
、map
、
timestamp
、duration
などがあります。
作成
マップを作成するには、中かっこの間に 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 Storage の Firebase 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');