5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

FirestoreやStorageのセキュリティルールにはv2から変数が使えるぞ【今世紀最大の驚き】

Last updated at Posted at 2020-05-14

タイトルのままなのですが、おそらく世の中の99%の人が知らない知識です。(私調べ)

変数の使い方

条件

  • rules_version = '2';
  • functionの中でのみ使える

使い方

firestore.rules
rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    function isAuthorOrAdmin(userId, article) {
      // こんな感じでletが使えちゃう
      let isAuthor = article.author == userId;
      let isAdmin = exists(/databases/$(database)/documents/admins/$(userId));
      return isAuthor || isAdmin;
    }

    match /articles/{article_id} {
      match write: if isAuthorOrAdmin(request.auth.uid, resource);
      match read: if request.auth != null;
    }
  }
}

びっくりですね〜!

ですが、この例の場合は、 isAdmin がisAuthorがtruehyの時にも呼び出されてしまうので、もったいないです。
遅延評価を活用して、呼び出しを抑制してみましょう。

firestore.rules


rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    function isAdmin(userId) {
      return exists(/databases/$(database)/documents/admins/$(userId));
    }
    function isAuthorOrAdmin(userId, article) {
      let isAuthor = article.author == userId;
      // `||`を活用して isAuthorがfalseの場合のみisAdminが呼ばれる
      return isAuthor || isAdmin(userId);
    }

    match /articles/{article_id} {
      match write: if isAuthorOrAdmin(request.auth.uid, resource);
      match read: if request.auth != null;
    }
  }
}

これで、無駄に呼ばれることがなくなったのでいい感じです。

このletが使えるのはFirestoreだけでなくStorageでも利用できるようです!

変数の制限

  • Functionの中で10個まで宣言できる
  • Functionの終了は絶対returnしないといけない

まとめ

変数を使って可読性の高いルールを書いていきましょう。

実践FirestoreというFirestoreのルールやら設計やらの参考になりFirestoreやるならマストバイな良本があるのですが、それにも載ってないぐらい恐らく誰にも知られていません。

参考文献

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?