Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Djangoで組織とユーザーの権限管理をやってみよう #devio2022

seiichi
July 30, 2022

Djangoで組織とユーザーの権限管理をやってみよう #devio2022

最近ひょんなことからDjangoでWebアプリケーション開発を始めたのですが、組織とユーザーの権限管理の実装でハマるポイントが多かったので紹介させていただきます。

※2022年7月19日〜29日開催の技術カンファレンス「DevelopersIO 2022」のセッション動画での資料です。

youtube: https://youtu.be/7zQdngoCysw
github: https://github.com/seiichi1101/devio2022

seiichi

July 30, 2022
Tweet

More Decks by seiichi

Other Decks in Technology

Transcript

  1. Djangoで組織とユーザーの権限管理
    をやってみよう
    CX事業本部
    新井 成一

    View Slide

  2. 2
    自己紹介
    クラスメソッド株式会社
    バックエンドエンジニア
    Python歴: 5年ぐらい
    Django歴: 3ヵ月ぐらい

    View Slide

  3. 3
    なぜこのテーマか?
    「組織とユーザーの権限管理」において
    そもそもDjangoの組み込みモデルを
    利用・拡張するべきか?という考慮が必要
    日本語の情報が少ない
    ハマるポイントおおい

    View Slide

  4. 4
    やりたいこと
    Organization A
    Admin Editor Viewer
    Organization B
    Admin Editor Viewer
    Alice Bob

    View Slide

  5. 5
    やりたいこと
    ユーザーの登録ができる
    組織の登録ができる
    ユーザーは複数の組織に所属することができる
    ユーザーは所属する組織毎に権限を与えられる
    権限は Admin、Editor、Viewer のいずれかとする
    権限に応じたアクセス制御が可能とする

    View Slide

  6. 6
    ERD

    View Slide

  7. 7
    Index
    セットアップ
    ユーザーと組織の権限管理について
    ユーザーと組織の実装
    権限の実装

    View Slide

  8. 8
    セットアップ

    View Slide

  9. 9
    期待するイメージ
    1. ユーザーがログイン後に自分のユーザー情報が確認で
    きる

    View Slide

  10. 10
    初期設定
    # Python Version
    $python --version
    Python 3.9.6
    # Install Django
    $python -m pip install Django
    $python -m django --version
    3.2.13
    # Create Django Project
    $django-admin startproject devio2022

    View Slide

  11. 11

    View Slide

  12. 12
    GitHubの対象ブランチを参考
    https://github.com/seiichi1101/devio2022/tre
    e/setup

    View Slide

  13. 13
    ユーザーと組織の
    権限管理について

    View Slide

  14. 14
    アプローチ - モデル設計
    1. 組み込みのGroupとPermissionsを利用する方法
    テーブル数やコード量が増えず簡潔
    Djangoが想定している以上の使い方ができない
    2. 3rd Partyのライブラリを利用する方法
    組織管理者の作成や組織への招待など多機能
    必要以上の機能があることで混乱したり拡張が難しい
    3. 自分で必要なモデルと機能を実装する方法
    必要十分な機能を自分で実装でき拡張性が高い
    コード量・テーブル数が増え複雑さ・管理コストが増える

    View Slide

  15. 15
    アプローチ - 権限管理ライブラリ
    1. django-guardian
    2. django-role-permissions
    既存のPermissionsモデルを拡張して使う
    インスタンスレベルでのアクセス制御ができる
    汎用的な権限のまとまりを設定することは難しい
    3. django-rules
    権限管理にデータベースモデルを使用しない
    コードベースでアクセス制御ができるためカスタマイズしやすい
    汎用的な権限のまとまりを設定することもできる
    アクセス制御のロジックを実装するため多少コード量は増える

    View Slide

  16. 16
    ユーザーと組織の実装

    View Slide

  17. 17
    実装方針
    Organizationが複数のRole Groupを持ち、Role Groupに複
    数のUserが所属するよう実装します

    View Slide

  18. 18
    期待するイメージ
    1. ユーザーがログイン後に自分のユーザー情報が確認
    できる
    2. ユーザーがログイン後に自分が所属する組織の情報
    が確認できる

    View Slide

  19. 19

    View Slide

  20. 20
    GitHubの対象ブランチを参考
    https://github.com/seiichi1101/devio2022/tre
    e/user_org_impl

    View Slide

  21. 21
    権限の実装

    View Slide

  22. 22
    実装方針
    各Role Groupに必要なRoleを設定し、Roleの種類に応じ
    たアクセスコントロールを実装します

    View Slide

  23. 23
    期待するイメージ
    1. ユーザーがログイン後に自分のユーザー情報が確認
    できる
    2. ユーザーがログイン後に自分が所属する組織の情報
    が確認できる
    3. ユーザーは自分が所属する組織のページへのみ遷移
    できる
    4. ユーザーは権限のない操作はできない

    View Slide

  24. 24

    View Slide

  25. 25
    GitHubの対象ブランチを参考
    https://github.com/seiichi1101/devio2022/tre
    e/role_impl_1
    https://github.com/seiichi1101/devio2022/tre
    e/role_impl_2

    View Slide

  26. View Slide