Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
RealtimeDBルールでの頑張り
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
miyanokomiya
May 21, 2019
Technology
390
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RealtimeDBルールでの頑張り
Firebase + Vue.js Meetup@渋谷
https://re-build.connpass.com/event/131004/
miyanokomiya
May 21, 2019
More Decks by miyanokomiya
See All by miyanokomiya
The state patternの実践 個人開発で培ったpractice集
miyanokomiya
0
260
Other Decks in Technology
See All in Technology
AWS DevOps Agent スキルをつかいこなそう / Master AWS DevOps Agent Skills
kinunori
2
650
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
16
120k
大阪オフィスに Unitree Go2 がやってきたので Physical AI やってみた
dafujii
0
180
10年欲しかった音楽管理アプリを、AIと一緒に作りはじめた
judau
1
190
AI臭い文章とは何なのか
nasuvitz
36
76k
Oracle Cloud Infrastructure(OCI):Onboarding Session(はじめてのOCI/Oracle Supportご利⽤ガイド)
oracle4engineer
PRO
3
21k
Making AI Agents Safe and Fast- Jev, Obsidian, and the Meta-Harness
x5gtrn
PRO
0
170
Mastering Agentic Development: Harness Engineering for Effective Coding Agents
konippi
3
660
なぜAI任せのゲームは面白くならないのか?
hirohasuyoutube
0
350
ボードゲームの遊び相手をFoundation Modelsで作る / iOSDC Japan 2026
genda
0
240
20260930_Gemma4_Hands-on
tsho
0
190
React Nativeでの OTA Updateって、 どう説明する?
ichiki1023
0
130
Featured
See All Featured
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
710
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
The Pragmatic Product Professional
lauravandoore
37
7.5k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
The Limits of Empathy - UXLibs8
cassininazir
1
690
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
My Coaching Mixtape
mlcsv
0
330
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Fireside Chat
paigeccino
43
4k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
310
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
260
Transcript
RealtimeDBルールでの頑張り 自作オンラインマインドマップサービスの実装例
自己紹介 小宮山智也 メドピア株式会社 フロントエンドエンジニア ボルダリング
近況 https://hopeful-visvesvaraya-3dafb6.netlify.com/ https://qiita.com/miyanokomiya/items/4b0bf8561adc5f7a0754
話すこと概要 • FirebaseとVueで作ったマインドマップサービス紹介 • 作り込んだRealtimeDB権限ルール紹介 • Firestoreとの比較 • 質問などあれば ここを見ながらだと理解が捗るかもしれないです
https://gitlab.com/miyanokomiya/mind-xx-acpr/blob/master/database.rules.json
機能と権限
マインドマップ機能 • ルートから左右にノードを生やせる ◦ DnDでノードを移動 ◦ WebSocketでリアルタイム編集 • ノードにコメントできる •
普通に使えるマインドマップ(多分) フリースペースはこちら(質問書いてくれたら最後に拾えるかも) https://mind-xx-acpr.firebaseapp.com/map/-LfJzihYKQJLt9hHuNFQ
database.rules.jsonのルート要素 • users • file_invitations • file_authorities • work_spaces •
files • nodes • comments • ユーザー情報 • ファイル共有招待トリガー用 • ファイル権限 • ワークスペース情報 • ファイル情報 • ファイル毎のノード情報 • ファイル毎のコメント情報
ファイル権限ルール1 • file_authorities ◦ ファイル権限 • files ◦ ファイル情報 •
nodes ◦ ノード情報 • comments ◦ コメント情報 - file_authorities - $file_id (ファイル毎に) - users (ユーザー毎に) - $uid (データがあればreadは可) - write (write権限フラグ) - owner (所有者フラグ)
ファイル権限ルール2 • files、nodes、commentsは同じ閲覧・権限ルール ◦ データアクセスの都合で階層分けているが、実態は1つのファイル単位 ◦ 他人コメントは削除不可など細かなルールはマジムリなので UIだけで妥協している • read
◦ root.child('file_authorities/' + $file_id + '/users/' + auth.uid).exists() • write ◦ root.child('file_authorities/' + $file_id + '/users/' + auth.uid + '/write').val() === true
ワークスペース • ファイル管理 ◦ 作成、編集、削除、複製 ▪ ファイル権限 • ファイル一覧表示 ◦
自分の一覧 ◦ 共有中一覧 ◦ 自分&共有中の一覧
ワークスペースデータ構造 • work_spaces - $uid (自分のワークスペースのみアクセス可 ) - files (自分が所有者のファイル
) - $file_id - invited_files (共有中のファイル) - $file_id • 都度selectではなく、予め一覧のデータ構造を作っている ◦ id一覧を取得してフロントエンドで個別にファイルと権限情報を get ◦ where条件などは妥協・・
ファイル共有と招待
ファイル共有 • 他のユーザーとファイルを共有 ◦ 閲覧のみ可 ◦ 編集も可 • サービス内ユーザーのみ ◦
サービス自体への招待機能はない ◦ メール機能とか使えばできるかも?
ファイルへの招待フロー • まずはRealtimeDBに招待用データを登録 • file_invitations - $file_id (ファイルへの招待権限はファイルと同じ ) -
$tmp_id (ただの識別子) - email (招待するユーザーのメアド ) - write (write権限フラグ) • 登録をトリガーとしてCloud Functionsで権限とワークスペースを整える
ファイル権限ルール再掲 • file_authorities - $file_id (ファイル毎に) - users (ユーザー毎に) -
$uid (データがあればreadは可) - write (write権限フラグ) - owner (所有者フラグ) 共有したユーザーの権限もこの構造で 表現可能(owner: falseとなる)
なぜCloud Functions • file_authoritiesは新規作成のみ可、変更不可としている ◦ readかwriteルールしか付けられない ◦ 共有中のユーザーも招待可能にしたい => write:
true => ownerを乗っ取れてしまう ◦ Cloud Functionsならコードに書いた変更しかできない ▪ トップダウン式なRealtimeDBルールでは意図せぬ変更への対応は限界がある • 招待されたユーザーのワークスペースにファイルを追加したい ◦ 他人のワークスペース編集を許可するわけにはいかない ◦ Cloud Functionsなら裏側でルールを突き破ることが可能
Beyond Borders • work_spaces - $uid (本人のみアクセス可 ) - files
(自分が所有者のファイル ) - $file_id - invited_files (共有中のファイル) - $file_id - file_authorities - $file_id (ownerのみwrite可) - users - $uid - write - owner Could Functionsでルールを無視して書き込む
公開ファイル
公開ファイル • 認証不要でアクセス可能 ◦ 閲覧のみ可 ◦ 編集も可 ◦ https://mind-xx-acpr.firebaseapp.com/map/-L1kyhrBlrHGorkL4ws_ Cloud
Functions不要で、ファイル編集 権限があれば変更可能としている • file_authorities - $file_id (ファイル毎に) - public (データがあればreadは可) - write (write権限フラグ)
ファイル権限ルール2の拡張 • files、nodes、commentsは同じ閲覧・権限ルール ◦ データアクセスの都合で階層分けているが、実態は1つのファイル単位 ◦ 他人コメントは削除不可など細かなルールはマジムリなので UIだけで妥協している • read
◦ root.child('file_authorities/' + $file_id + '/users/' + auth.uid).exists() ◦ or root.child('file_authorities/' + $file_id + '/public').exists() • write ◦ root.child('file_authorities/' + $file_id + '/users/' + auth.uid + '/write').val() === true ◦ or root.child('file_authorities/' + $file_id + '/public/write').val() === true
ファイル削除
ファイル削除 • ここまでの作り込みによってファイル権限はとても複雑 ◦ 行きはよいよい帰りは怖い ◦ 意図せぬ編集を防いだまま削除だけは許すなんて Firebaseの天才でないとムリ Cloud Functionsで消してしまえ!!
ワークスペースデータ構造再掲 • work_spaces - $uid (自分のワークスペースのみアクセス可 ) - files (自分が所有者のファイル
) - $file_id - invited_files (共有中のファイル) - $file_id ここの$file_id削除をトリガーとして ファイル削除のCloud Functionsを起動
None
RealtimeDBまとめ
RealtimeDBルールの所感 • jsonでルールを書くのでとにかく冗長 ◦ トップダウンのルール適用&データ取得なのでネストを浅くする => ルールをコピペの嵐 • readとwriteしかないのは辛い ◦
せめてupdateとdeleteは分けたい • 困ったらCloud Functionsでなんとかする ◦ Cloud Functionsなしでルールを組み上げきったのなら、それは芸術作品 • よっぽどの理由がなければ今後はFirestoreを検討しよう! ◦ ルールに関数を使える! ◦ read、create、update、deleteの設定ができる! ◦ でも最終的には困ったらCloud Functions!
とはいえRealtimeDBのメリット • FirestoreはDocumentのread数課金 ◦ 今回のようなマインドマップツールだと、ノードが Documentになるのでreadが嵩む ◦ 権限判定時もreadが加算されるので、ルールが複雑になるにつれて readが嵩む ◦
個別Documentのデータ量が少ないなら RealtimeDBの課金体系は有利(※要検証) • とにかくシンプル ◦ 全てがトップダウンで jsonな構造なので覚えるべき概念がほとんどない ◦ FirestoreはDocumentやCollectionなどある程度の学習コストが必要 • Firestoreはまだベータ
そうはいっても流れはFirestore • RealtimeDBとFirestoreの選択で判断に迷う箇所は課金体系くらい • 学習コストはあるが、それに見合う高機能が用意されている • ベータとはいえ、機能は十分にあるし常に進化している ◦ 本リリースになったタイミングである程度のマイグレーションコストは払う覚悟は必要 ◦
Cloud Functionsもそれほどの規模ではなかったがマイグレーションが必要だった ▪ 本リリースに気付かず一時期放置してたら動かなくなっていた・・
ご静聴ありがとうございました • 何か質問などあれば • メドピア、フロントエンド募集してます • 水曜夜は新宿ロッキー(or 秋パン)でボルダリング