最近ひょんなことからDjangoでWebアプリケーション開発を始めたのですが、組織とユーザーの権限管理の実装でハマるポイントが多かったので紹介させていただきます。
※2022年7月19日〜29日開催の技術カンファレンス「DevelopersIO 2022」のセッション動画での資料です。
youtube: https://youtu.be/7zQdngoCysw github: https://github.com/seiichi1101/devio2022
Djangoで組織とユーザーの権限管理をやってみようCX事業本部新井 成一
View Slide
2自己紹介クラスメソッド株式会社バックエンドエンジニアPython歴: 5年ぐらいDjango歴: 3ヵ月ぐらい
3なぜこのテーマか?「組織とユーザーの権限管理」においてそもそもDjangoの組み込みモデルを利用・拡張するべきか?という考慮が必要日本語の情報が少ないハマるポイントおおい
4やりたいことOrganization AAdmin Editor ViewerOrganization BAdmin Editor ViewerAlice Bob
5やりたいことユーザーの登録ができる組織の登録ができるユーザーは複数の組織に所属することができるユーザーは所属する組織毎に権限を与えられる権限は Admin、Editor、Viewer のいずれかとする権限に応じたアクセス制御が可能とする
6ERD
7Indexセットアップユーザーと組織の権限管理についてユーザーと組織の実装権限の実装
8セットアップ
9期待するイメージ1. ユーザーがログイン後に自分のユーザー情報が確認できる
10初期設定# Python Version$python --versionPython 3.9.6# Install Django$python -m pip install Django$python -m django --version3.2.13# Create Django Project$django-admin startproject devio2022
11
12GitHubの対象ブランチを参考https://github.com/seiichi1101/devio2022/tree/setup
13ユーザーと組織の権限管理について
14アプローチ - モデル設計1. 組み込みのGroupとPermissionsを利用する方法テーブル数やコード量が増えず簡潔Djangoが想定している以上の使い方ができない2. 3rd Partyのライブラリを利用する方法組織管理者の作成や組織への招待など多機能必要以上の機能があることで混乱したり拡張が難しい3. 自分で必要なモデルと機能を実装する方法必要十分な機能を自分で実装でき拡張性が高いコード量・テーブル数が増え複雑さ・管理コストが増える
15アプローチ - 権限管理ライブラリ1. django-guardian2. django-role-permissions既存のPermissionsモデルを拡張して使うインスタンスレベルでのアクセス制御ができる汎用的な権限のまとまりを設定することは難しい3. django-rules権限管理にデータベースモデルを使用しないコードベースでアクセス制御ができるためカスタマイズしやすい汎用的な権限のまとまりを設定することもできるアクセス制御のロジックを実装するため多少コード量は増える
16ユーザーと組織の実装
17実装方針Organizationが複数のRole Groupを持ち、Role Groupに複数のUserが所属するよう実装します
18期待するイメージ1. ユーザーがログイン後に自分のユーザー情報が確認できる2. ユーザーがログイン後に自分が所属する組織の情報が確認できる
19
20GitHubの対象ブランチを参考https://github.com/seiichi1101/devio2022/tree/user_org_impl
21権限の実装
22実装方針各Role Groupに必要なRoleを設定し、Roleの種類に応じたアクセスコントロールを実装します
23期待するイメージ1. ユーザーがログイン後に自分のユーザー情報が確認できる2. ユーザーがログイン後に自分が所属する組織の情報が確認できる3. ユーザーは自分が所属する組織のページへのみ遷移できる4. ユーザーは権限のない操作はできない
24
25GitHubの対象ブランチを参考https://github.com/seiichi1101/devio2022/tree/role_impl_1https://github.com/seiichi1101/devio2022/tree/role_impl_2