LoginSignup
32
23

More than 5 years have passed since last update.

Firebase Boltでセキュリティルールを記述する

Posted at

Firebase Bolt とは

Firebase リアルタイムデータベースのセキュリティルール用のコンパイラです。

例えば以下のコードは

all_access.bolt
path / {
  read() { true }
  write() { true }
}

次のjsonのセキュリティルールと同じ意味になります。

all_access.json
{
  "rules": {
    ".read": "true",
    ".write": "true"
  }
}

現在はBeta版で言語仕様は確定しているようですが本番にデプロイする前にjsonの出力をチェックしたほうが良いそうです。

インストール

boltはTypeScriptで書かれているツールなのでnpmでコンパイラが配布されています。

以下のコマンドでインストールできます。

$ npm install --global firebase-bolt

使い方

以下のようにルールを記述したファイルを作成します。

database.rules.bolt
path / {
  read() { false }
  write() { false }
}

以下のコマンドでコンパイル結果を標準出力に書き出せます。

$ firebase-bolt < database.rules.bolt
{
  "rules": {}
}

第一引数にファイルを指定することでjsonを書き出してくれます。

$ firebase-bolt database.rules.bolt
bolt: Generating database.rules.json...
$ cat database.rules.json
{
  "rules": {}
}

コメント

boltではJavaScriptのようにコメントを書くことができます。
jsonではコメントは書けないのでこれだけでも かなり嬉しいですね。

// Single line

/*
Multi
Line
*/

boltにはTypeScriptのような型を定義することができます。
型を継承することも可能です。

type Group {
  validate() { members != null }

  members: Map<TenKeys, User>
}

type User {
  uid: String,
  name: String
}

type TenKeys extends String {
  validate() { this.length == 1 && this >= '0' && this <= '9' }
}

Mapや配列もありますしUnion型やジェネリクスもあります。

Path

pathを指定したところにアクセス権や型を適応します。

// 全ての人が読み書きできる
path / {
  read() { true }
  write() { true }
}
// /users/{uid}をUser型にする。
path /users/{uid} is User {
  // 誰でも読み込める
  read() { true }

  // 認証した人だけが書き込める
  write() { auth != null && auth.uid == uid }
}

createupdatedeleteのエイリアスもあります。

path /docs/{uid} {
    /create { create() { true } }
    /update { update() { true } }
    /delete { delete() { true } }

    /create-or-update {
      create() { true }
      update() { true }
    }
}

prior()

prior()で書き込みされる前の値を取得できます。

関数

boltでは関数を定義することができます。
処理をひとまとめにして意味のわかる名前を付けることができます。

function isUser(uid) {
  return auth != null && auth.uid == uid;
}

// 上と下の関数は同じ意味

isUser(uid) {
  auth != null && auth.uid == uid;
}

グローバル変数

rootはデータベースのrootのリファレンスにアクセスできます。
authは認証情報が入っています。認証されていなければnullになります。
nowには現在時刻のUnixタイムスタンプが入っています。

ここはjsonでも同じですね。

まとめ

セキュリティルールを書くのが辛くてついつい雑にしてしまいがちですが型を定義できるなら
楽に書けそうな気がします。
VSCodeでシンタックスハイライトしてくれそうなやつはあるのですが 僕の環境では何故か上手く行かなかったので 今後の課題かなと思います。

最新の内容はGitHubを確認してみてください。

またサンプルも色々あるのでそちらを見てみるのも良いと思います。

32
23
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
32
23