Cloud Firestore セキュリティルールの基本的な読み書き方法
firebaseからセキュリティが甘いです危険ですっていうメールが来てたので、いい加減設定しようと思いまして勉強しました。
firebaseは細かなルールを設定できるようにもなっていますが、今回はルールの基本的な読み書きができるようになるところまで調べました。ここを抑えていれば、あとは自分で都度調べてルールが書けるってところまでできるようになります。
例として、以下のようなデータに対して、認証(ログイン)済みのユーザーであればuserというコレクションに含まれるすべてのドキュメントとサブコレクションに対して色々操作できますよというルールを設定します。
users(コレクション)
└ userA(ドキュメント)
name: 'Aさん'(フィールド)
gender: '男性'
hobby: '魚釣り'
└ userB
name: 'Bさん'
gender: '女性'
hobby: 'コーヒー'
└ blog(サブコレクション)
└ post1(ドキュメント)
title: 'タイトル'(フィールド)
header: 'ネコの画像'
createdTime: 2020-10-11-11:11
先に答えを書いてしまいますが、認証(ログイン)済みのユーザーであればusersというコレクションに含まれるすべてのドキュメントとサブコレクションに対して色々操作できる。というルールは以下のように書きます。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match/users/{document=**} {
allow read, write : if request.auth != null;
}
}
}
では、1行目から見ていきましょう!
今回、ルールの設定はfirebaseのコンソールから行います。
Firebaseコンソール>設定したいアプリ選択>右側のアイコンCloud Firestoreを選択>ルールを選択
セキュリティーバージョンの宣言
rules_version = '2';
ここではセキュリティバージョン2を使いますと宣言しています。書かない場合はバージョン1が適用されます。バージョン2では再帰的ワイルドカード(後述)が使えます。
CloudFirestoreのルールを設定するという宣言
service cloud.firestore {
match /databases/{database}/documents {
この部分は定型文みたいなもんなので気にしなくていいです。
内容としてはCloud Firestoreのルール設定をしてますよって宣言しています。
(ココを書き換えればRealtime DatabaseとかCloud Storageの設定もできるようですが割愛)
パスの設定
match/users/{document=**} {
ここではパスを設定します。ルールを適用するデータベースの場所を指定します。usersのところをあなたが指定したいコレクション名に変えてくださいね。documentは任意の名前をいれてください。
ところで...
{document=**}
=**ってナニ!?となりますよね。
これが セキュリティバージョン2で使用できる再帰的ワイルドカードです。これを使いたいので、1行目に rules_version = '2' と宣言したんですね。
もし再帰的ワイルドカードを使用せずに以下のように書いた場合
{document}
Firestoreのルールは指定したドキュメントの階層にのみ適用されますのでその下層には適用されません。つまり、こういう風にかくとドキュメントuserA(とそのフィールド)とuserB(とそのフィールド)には適用されますが、userBのサブコレクション以下にはルールが適用されません。
具体的にいうと下の図のblogとpost1に適用していないということになります。
users(コレクション)
└ userA(ドキュメント)
name: 'Aさん'(フィールド)
gender: '男性'
hobby: '魚釣り'
└ userB
name: 'Bさん'
gender: '女性'
hobby: 'コーヒー'
└ blog(サブコレクション)
└ post1(ドキュメント)
title: 'タイトル'(フィールド)
header: 'ネコの画像'
createdTime: 2020-10-11-11:11
それじゃあ困る。userBのサブコレクションにもルールを適用させたいわけですから、その解決法として再帰的ワイルドカードを利用しているわけです。
allow式の書き方
allow read, write : if request.auth != null;
allow式です。ここではreadとwriteという2つのアクセス権が与えられていますが、さらに細かく設定することができます。readとwriteというのは以下のようなアクセス権を含んでいます。
read → get, list
write → create, update, delete
なので、例えば delete は使わせたくないなと思った場合は
allow read, create, update : if request.auth != null;
と表記すればいいです。request.auth の詳細についてはリファレンスドキュメントを参考にしてください。
まとめ
これで基本的な、超基本的なルールの読み書きはできるようになります。
おさらいしてみると、
rules_version = '2';
→再帰的ワイルドカード使いたいからセキュリティバージョン2使います宣言
service cloud.firestore {
→定型文。CloudFirestoreに適用させるルール書きますの意味
match /databases/{database}/documents {
→定型文
match/users/{document=**} {
→usersというコレクション以下のすべてのドキュメントに適用させます
allow read, write : if request.auth != null;
→認証済みのユーザーにreadとwrite許可します
}
}
}
こんな感じになっているわけです。
セキュリティルールはシンプルながらも細かくルールを設定できるようになっています。(さすが頭のいい人達が作っただけのことある)
さらに詳しく知りたい方は以下の記事、公式リファレンスをオススメします。
Firebase セキュリティルール
公式ですがとっても読みやすいです。ここまで読んでくれたら尚更読みやすいはずです。ぜひ一度読んでください。
【改訂版】 Firebase Cloud Firestore rules tips
公式の内容をギュギュっと要約してくれてる良記事です。