はじめに
最近個人的にCloudFirestoreを使っているのですが、
Firestoreはセキュリティルールによってデータの読み込み/書き込みを制限することができます。
デフォルトでは下記のようにdocuments配下が全許可で、
Firestoreの読み込み/書き込みが誰でもできる状態です。
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write;
}
}
}
セキュリティルールの指定がよくわかっておらずしばらくこのままだったのですが、
さすがにまずいなと思い修正したので記録を残しておきます。
セキュリティルールの種類
デフォルトのread/write以外に、get/list/create/update/deleteの5つがあります。
read
|-get
|-list
write
|-create
|-update
|-delete
read/writeで記載してもいいですが、
create/updateとdeleteは区別して定義しても良いと思います。
FirebaseAuthenticationで認証した人しかcreate/updateできないように制御してみました。
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read;
allow create,update :if request.auth != null;
}
}
}
ワイルドカード
デフォルトだと、Firestoreのすべてのdocumentにアクセスできてしまいます。
match /{document=**} {
document毎にルールを分けるには下記のように表現します。
ネストもできるので階層が深くなってもOKです。
service cloud.firestore {
match /databases/{database}/documents {
match /books/{bookId} {
allow read;
allow create,update :if request.auth != null;
}
}
}
自分のユーザ情報だけ編集できるようにする
URLで渡されたuserIdで認証されている場合のみ、更新が可能です。
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read;
allow update :if request.auth.uid == userId;
}
}
}
セキュリティルールが弱いとメールが送られてきます
ちなみにセキュリティルールをデフォルトのままにしていると、警告メールが送られてきます。
[Firebase] Cloud Firestore データベースに安全でないルールがあります
プロジェクトには強力なセキュリティ ルールがないため、誰でもデータベース全体にアクセスできます。
攻撃者はデータを窃取、変更、削除でき、また請求額を増やすことが可能です。
セキュリティルールがガバガバなので仕方ないのですが、
なかなかおっかない表現のメールです。(笑)
終わりに
もっと複雑な指定もできるのですが、
とりあえずはこのあたりだけでも把握しておくと警告メールは来なくなります。
下記でとても丁寧に説明してくれているので、複雑なルール指定をしたい場合は参考にしてください。