Slide 1

Slide 1 text

権限管理設計を完全に理解した 1

Slide 2

Slide 2 text

自己紹介 フリーランスエンジニア7年目 r-sugi 2

Slide 3

Slide 3 text

今回のアジェンダ マルチテナント SaaS の権限管理、なぜ難しいのか 試しに1つ提示するので、みんなであれこれ議論したい 3

Slide 4

Slide 4 text

今回のスライド 詳細はこの記事 4

Slide 5

Slide 5 text

権限管理ってなんだっけ? 認証(Authentication) 「あなたは誰ですか?」 本人確認のプロセス。Googleアカウントでログインするのが認証。 認可(Authorization)← 本日のテーマ 「あなたは何をしてよいですか?」 何ができるかの制御。ログイン後にどの画面を見られるか・どの操作ができ るかを制御する。 5

Slide 6

Slide 6 text

権限管理、なぜ難しいのか 最初は if user.role === "admin" から始まる… 気づいたころには「この条件、正しいんだっけ?」と誰も答えられないコードになっ ている toC → toBシングルテナント → toBマルチテナント マルチテナント 複数テナントが同一DBに共存 テナント間のデータ分離が必須 ロール以外にも、プランなど組み合わせが加わり、複数軸が絡み合う 6

Slide 7

Slide 7 text

RBAC とその限界 RBAC=ロールに権限を紐づけるシンプルなモデル。認知率は高いが、すぐ限界が来 る。 shop_owner_pro のような謎ロールが増殖 (role x plan) if admin? && manager? || shop_leader? と連鎖 7

Slide 8

Slide 8 text

やらかしパターン 3選 バックエンド:Policy クラスにビジネスロジックが混入 フロントエンド:role を直参照、バックと二重管理に テーブル設計:admin_leader_users テーブルが爆誕 8

Slide 9

Slide 9 text

バックエンド Policy クラスにビジネスロ ジックが増えていく 9

Slide 10

Slide 10 text

フロントエンド role直書き 10

Slide 11

Slide 11 text

テーブルに切り出す 権限判定用ではなさそうな テーブルを作成。 毎回参照したり、フラグにして 使い回したりする 11

Slide 12

Slide 12 text

権限管理の概念 PBAC + ReBAC PBAC: 「何ができるか」をポリシーに集約する ロール、プラン→権限の最小単位をポリシーとして定義する イメージ: AWS IAM role: policies ReBAC: 「誰のリソースか」をリレーションで守る PBACだけでは他テナントのリソースへの横断アクセスを防げない 「顧客一覧を取得できる権限がある」→他テナントの顧客も取得できてしま う 12

Slide 13

Slide 13 text

サンプル:コンビニチェーン向けマルチテナントSaaS 13

Slide 14

Slide 14 text

PBAC: 「何ができるか」をポリシーとして定義する 14

Slide 15

Slide 15 text

PBAC 店舗作成できるかの判定 宣言的にpolicyを指定できる 15

Slide 16

Slide 16 text

ReBAC: 「誰のリソースか」をリレーションで守る 16

Slide 17

Slide 17 text

ReBAC: 店舗の情報を閲覧しようとした 17

Slide 18

Slide 18 text

ReBAC: 店舗の情報を閲覧し ようとした リポジトリ全体にフィルター済 みのscopeを注入しておく 個別処理を実装する際にscopeを 参照して一覧を取得する(一括処 理系も同様) すごくしんどい 18

Slide 19

Slide 19 text

19

Slide 20

Slide 20 text

まとめ 権限管理はPBAC x ReBACがベース PBACは導入しやすい。ReBACはつらい(RLSを入れてもつらそう) 20