UIDを何故ドキュメントIDに使用するのか?
詳しく書いみようと思った...
詳しくと見出しに書いてしまいましたが、実際のところは、これで詳しくというのは、個人の考えです🤔
結論をいうと、Firestoreのセキュリティールールを書きやすくするためなんですよね。
なぜ書きやすくなるのか?
Firestoreにデータを保存すると、ランダムなIDが作られるじゃないですか💁
みどりさん: 「これって誰のデータですか?」
egoさん: 「わかりません...」
はい、わかるわけないです。だってランダムに生成されているんだもの!
Firestoreを使うときですが、基本はAuthenticationと組み合わせます。
例を出すと、こんな感じのコードになりますね。
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:uuid_application/model/post_model.dart';
class ServiceClass {
final db = FirebaseFirestore.instance;
final auth = FirebaseAuth.instance;
Future<void> addPost(String nameController) async {
final uid = auth.currentUser?.uid;
final newPost = PostModel(
id: uid,
name: nameController,
);
await db.collection('post').doc(uid).set(newPost.toMap());
}
}
setを使う場合だと、ユーザーのuidを指定して、Firestoreにデータを保存するので、ドキュメントIDが、ランダムなものではなくて、ユーザーアカウントを作成したときのuidが、ドキュメントIDとなります。
taro@co.jpのユーザーUIDが使われる
ログインしてデータを保存してみた!
「おっ一致してますね。」これが、ドキュメントIDとユーザーのuidを一致させるということか!
なるほどなるほど。
こちらがセキュリティールールです
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// postコレクションにログインしているユーザーが書き込み可能
match /post/{uid} {
// ドキュメントIDと書き込みリクエストした認証ユーザーが一致していれば許可
allow create: if request.auth != null;
}
}
}
ユーザーがログインしていたら、データを保存する(書き込みと本では表現されていた)ことができます。
コンソールで、ダミーのデータを使ってセキュリティールールが正しく動いているのかテストすることができます。
セキュリティールールのテストをしてみる
画面左の星マークをクリックしてください。
ルールプレイグランドなるものがありますね。こちらをクリックしてみましょう。そしたら、入力するところがいっぱい出てきましたね。
こちらの項目を選択したり、記入をしてテストができます。
やり方
- 今回やるのは、データの保存なので、シュミレーションタイプをcreateにする。
- 場所のところは、パスを指定します。パスってのは、コレクション名/フィールド名です。今回だと、postコレクションのnameフィールドのことですね。
- ドキュメントを作成のボタンを押して保存するダミーのデータのフィールド名、データの型、値を記入して、完了を押します。
- プロバイダは、google.comのままで、FirebaseUIDは、taro@co.jpさんという方のユーザーUIDを指定します。メールは、taro@co.jpを指定します。
- 名前、電話の項目は、空白のままで、実行ボタンを押します。
成功すると、緑色のログが表示されます。失敗したら赤いログが出てくて、間違ったセキュリティールールを書いているコードの部分に × 印がつきます!
最後に
以前こんな記事を書いていたのを思い出しました。
久しぶりに見てみると、なんでドキュメントIDとUIDを一致させるのかについて解説していませんでした。当時から、セキュリティールールを書きやすくするために、使うということは知っていました。こちらが今回使用したサンプルコード
状態管理は、していなくて初心者向けのログインとデータの追加を学べるだけのサンプルです。
StatefulWidgetとStatelessWidgetしか使ったことないよという人には、丁度良いかもしれません?
昔の私は、モデルクラスすら作ってませんでしたよ😅
Flutter大学はFlutterエンジニアに特化した学習コミュニティです! 初心者から中上級者まで幅広く在籍し、切磋琢磨しています! 入会をご希望の方はこちらから→ flutteruniv.com
Discussion