セキュリティルールの基本

セキュリティルールとは

データベースを作成した時点では、インターネットを通じて誰でも読み取り、編集ができる設定になっている。(ブラウザからも)

チャットのデータをプライベートな状態にしたり、データの荒らしが起きないようにするための設定が必要。

 

セキュリティルールの基本的な書き方

始めに書くこと

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
     //ここから書いていく
  }
}

どのデータに対してか

下記のコードは「room」というコレクションのXXXというドキュメントのアクセス権限を設定しています。

match /room/XXX{
   //ここでアクセス権限を設定する
}

「room」というコレクションの全てのドキュメントのアクセス権限を設定しています。

match /room/{roomID}{
    //ここでアクセス権限を設定する
}
波かっこ { } の中の文字列は変数のような働きをします。
例えば、上記のルールで、roomコレクションのabcdというドキュメントにアクセスした場合には、roomIDにabcdが代入されます。

アクセス権限の設定

下記のコードでは、読み込みを許可し、書き込みを拒否しています。

allow read:if true;
allow write:if false;
allow [操作の種類] : if [許可する条件] ;

詳細な条件指定

allow read:if true;
allow write:if false;

これまでの説明では、ifの後にtrue/falseを設定してきました。ここに、swiftのif文と同じような考え方で、条件式を指定することができます。

match /user/{userID}{
  allow read:if true;
  allow write:if userID == request.auth.uid;
}

request.auth.uidで、ユーザのuidを取得しています。(ユーザーによる改ざん不可)

例 : uidがabc123
user/def456 >>> 書き込み[拒否]
user/abc123 >>> 書き込み[許可]

Firestoreのデータを取得

get(/databases/$(database)/documents/[コレクション]/[ドキュメント])).data.[フィールド]

例: room/abcのuserという配列にuidが含まれていれば、書き込みを許可

match /room/{roomID}{
  allow read:if true;
  allow write:if request.auth.uid in get(/databases/$(database)/documents/room/$(roomID)).data.user;
}

コメント

タイトルとURLをコピーしました