0. 始めに
↓のメールが届いて、何かしないとな~って思ったら、何から始めるかをまとめた記事です1。
自分の備忘録兼学習の証跡みたいな感じになるので、N番煎じ感は否めないですが、それについてはご了承願います。
1. Firestoreセキュリティルールって何?
そもそも論ですね、一言で言えば、セキュリティのルールだってことは分かります(合ってるけどそうじゃない)。
公式ドキュメントによれば、Firestoreセキュリティルールを使えば、
インフラストラクチャを管理したり、サーバー側の認証コードや承認コードを作成したりする必要がなくなるため、デベロッパーは優れたユーザー エクスペリエンスを構築することだけに集中できます。
セキュリティ ルールは、シンプルでありながら高度な処理にも対応できる形式で、アクセス制御とデータ検証を提供します。
との事。ルールさえこちらで設定してあげれば、それに沿ってFirestore側がイイ感じにしてくれそう!
2. どこにどうやって設定するの?
例によって公式ドキュメントを覗いてみますと、「Firebase コンソール」と「Firebase CLI 」の2通りのやり方があるらしい。要するに、ブラウザから直接ルールを編集するか、自前のPCで設定してルールをデプロイするかって事ですね!
①Firebase コンソール
プロジェクトを開いたら、Database > ルール で編集できます
②Firebase CLI
firebase init
でFireBaseプロジェクトのディレクトリを作成した時に、↓でFirestoreを選ぶとfirestore.rulesってファイルが出来るのでそれを編集。
? Which Firebase CLI features do you want to set up for this folder? Press Space to select features, then Enter to confirm your choices. (Press <space> to select, <a> to toggle all, <i> to invert selection)
>( ) Database: Deploy Firebase Realtime Database Rules
( ) Firestore: Deploy rules and create indexes for Firestore
( ) Functions: Configure and deploy Cloud Functions
( ) Hosting: Configure and deploy Firebase Hosting sites
( ) Storage: Deploy Cloud Storage security rules
もし選択してなかった場合は、
> firebase init firestore
で再設定すれば、ファイルができるはず。そうして編集したルールのみをデプロイする場合は
> firebase deploy --only firestore:rules
でOK! まだプロジェクトを作ってない場合は手前味噌ですが、こちらを参考に。
3. デフォルトのルールを(ちらっと)確認する
今回は簡単そうな①でやってみます2、まずは、初期状態のルール確認から。
Firebaseプロジェクトを作成した直後はきっと下記のようなルールが設定されているはず!
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// This rule allows anyone on the internet to view, edit, and delete
// all data in your Firestore database. It is useful for getting
// started, but it is configured to expire after 30 days because it
// leaves your app open to attackers. At that time, all client
// requests to your Firestore database will be denied.
//
// Make sure to write security rules for your app before that time, or else
// your app will lose access to your Firestore database
match /{document=**} {
allow read, write: if request.time < timestamp.date(2020, 8, 27);
}
}
}
。。。なるほど分からん
大部分はコメントで、読み込みと書き込みが特定の日付まで許可されていそうってことは伝わるけど、他の部分がまるでさっぱり。。。
4. セキュリティルールを解読する
そうは言っても、読み解かない事には先に進めないので、上から順に解読していきます。
以降の節は、
4.1 バージョンとサービスの宣言
まずは最初の2行
rules_version = '2';
service cloud.firestore {
1行目はルール言語のバージョンを表しているらしいです。最新バージョンは2
との事。
現状の理解として、おまじない的なものとしてつけておけば良さそう。
2行目はfirestore
に対してセキュリティルールを設定している事を示している。ちなみにfirebase storage
の場合はfirebase.storage
となるみたい。
4.2 データベースの宣言
お次は、ルールをどのデータベースに適用するかを指定する行。2020/09/01現在、1つのプロジェクトにつきデータベースは1つで、(default)
って名前が付いているらしいですよ3。
つまり、↓はプロジェクト内の全てのデータベースを対象対にしたルールってことになりますね!ここも初期設定から変更しなくて良さげ!!
match /databases/{database}/documents {
...
{
// ↓でも、↑と同じ意味?
match /databases/default/documents {
...
{
4.3 基本的な読み書きのルール
最後にmatch
ステートメントと呼ばれる箇所。
match /{document=**} {
allow read, write: if request.time < timestamp.date(2020, 8, 27);
}
/{document=**}
は任意のコレクションに対して適用するって意味。4。まぁ要するに、プロジェクト内の全てのコレクションに対してルールが適用されるって事になりますね!
で、その肝心のルールですが 、
allow hogehoge
でhogehoge
出来ますよーってことなので、↑は読み書き(read, write
)を許可してますよーってことですね!その条件(if
より右)が、コレクションに対してアクセスした日付が2020/08/27
より過去であることってなります。
4.4 ルールまとめ
。。。以上、分解して読み解いていきました。
全部繋げると、
・プロジェクトのdefault
データベースにある
・全てのコレクションは
・2020/08/27
より過去なら読み書き可能
って意味ですね!いや~スッキリした!!
5. 今後の展望
次は自分でルールを設定してみまーす!
あ、そうそう。。。
デフォルトで設定されたルールですが、単にアクセス期間を伸ばしたいだけなら、
match /{document=**} {
allow read, write: if request.time < timestamp.date(2030, 8, 27);
}
ってすればOK!。。。なんだけど、例えテストモードで利用していてもその回避策はオススメ出来ないので、やっぱりしっかりとルール設定しないとね!(ブーメラン)