【はじめてのFirebase】第5話:セキュリティルールマスターに俺はなる!
おはこんばんちはaomaです。
記念日を通知する『KINENBI』というサービスを作ってます!
— aoma23 (@aoma23) 2021年1月22日
当日だけでなく○ヶ月記念日や777日記念日といったキリ番にも対応しています!
現在事前登録受付中です!よろしくお願いします!#KINENBI#拡散希望 https://t.co/0deleLPFQA
この物語はそんなaomaがはじめてのFirebaseに挑む壮大なアクションアドベンチャーである!第5話!
第5話の内容
- firestoreのセキュリティルールを設定できるようになる
本編
セキュリティルールやっていくぞ!
— aoma23 (@aoma23) 2021年1月20日
やばいんでね。 pic.twitter.com/oHow0D3egc
最強。
— aoma23 (@aoma23) 2021年1月20日
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
service https://t.co/pttdGoSdI2 {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if false;
}
}
}
— aoma23 (@aoma23) 2021年1月20日
> アクセス権を付与するルールが 1 つでも一致すれば、リクエストは許可されます。アクセス権を付与するルールが 1 つも一致しない場合、リクエストは拒否されます。
— aoma23 (@aoma23) 2021年1月20日
なるほど、つまりルールを書かなければ最強ってことでいいのかな?https://t.co/Ty5qjwFMLu
よし!これで自分のものしか作れないし、自分のものしか参照編集削除できない。完璧だ。
— aoma23 (@aoma23) 2021年1月20日
match /documents/{document=**} {
allow read, update, delete: if request.auth.uid == https://t.co/UkZsKc01N6.uid;
allow create: if request.auth.uid == https://t.co/A7XL7Hxvgz.uid;
}
フィールドの型チェックするのに参考になりそう。https://t.co/JTdjbVkSEa
— aoma23 (@aoma23) 2021年1月20日
セキュリティルールで存在すべきすべてのフィールドがあるかチェックするのどうすればいいか調べてる。。
— aoma23 (@aoma23) 2021年1月20日
すごいわかりやすいサイトあった。ありがたい。https://t.co/QxeIlWjYcU
— aoma23 (@aoma23) 2021年1月20日
なるほど。フィールドが意図したもののみかはList.hasAll(list)とList.hasOnly(list)の両方を使う必要があると。
— aoma23 (@aoma23) 2021年1月20日
hasAllで指定したフィールドが全て存在するか確認し、hasOnlyで指定したフィールドのみが存在することを確認する。
updateのフィールドのバリデーションでハマった。update時に渡してないフィールドでもドキュメントに存在していればある扱いになるので、変更がないことをチェックすることは必須らしい。
— aoma23 (@aoma23) 2021年1月20日
> request.resource 変数にはドキュメントの将来の状態が含まれます。
のあたり。https://t.co/luBIVOOIgR
補足。作成時にaa,bb,ccのフィールドがあったとして、create時のフィールドのセキュリティルールは下記のようになる。
— aoma23 (@aoma23) 2021年1月20日
data.keys().hasAll(['aa', 'bb', 'cc']) && data.keys().hasOnly(['aa', 'bb', 'cc']);
このときupdate時はccしか更新しなかった(jsでccしか渡さなかった)としても、→つづく
ccだけのチェックではエラーとなる。
— aoma23 (@aoma23) 2021年1月20日
data.keys().hasAll(['cc']) && data.keys().hasOnly(['cc']);
これはfirebase側でaa,bbを補完するからで、create時と同様に
data.keys().hasAll(['aa', 'bb', 'cc']) && data.keys().hasOnly(['aa', 'bb', 'cc']);
でチェックしてあげる必要がある。
※なお、ここで出てくるdataはhttps://t.co/A7XL7Hxvgzのこと。
— aoma23 (@aoma23) 2021年1月20日
かなり堅牢になった。
— aoma23 (@aoma23) 2021年1月20日
テストコードもかけるっぽいので明日チャレンジしてみようかな。。
To Be Continued...