Firebase Bolt とは
Firebase リアルタイムデータベースのセキュリティルール用のコンパイラです。
例えば以下のコードは
path / {
read() { true }
write() { true }
}
次のjsonのセキュリティルールと同じ意味になります。
{
"rules": {
".read": "true",
".write": "true"
}
}
現在はBeta版で言語仕様は確定しているようですが本番にデプロイする前にjsonの出力をチェックしたほうが良いそうです。
インストール
boltはTypeScriptで書かれているツールなのでnpmでコンパイラが配布されています。
以下のコマンドでインストールできます。
$ npm install --global firebase-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 }
}
create
、update
、delete
のエイリアスもあります。
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を確認してみてください。
またサンプルも色々あるのでそちらを見てみるのも良いと思います。