はじめに
「認証」は、多くのRailsアプリケーションで、devise
が使用されているかと思います。
ただ、「認可」に関しては、皆さんどのように実装されていますでしょうか?
今回実装するにあたって、考えた方法を3つご紹介いたします。
「認証」と「認可」の違いに関しては、本記事では解説いたしません。
詳しくは、以下の記事が参考になりますので、ご覧ください。
3選の紹介
① Pundit ・ cancancan
上記2つとも、認可周りをサポートしてくれるgemです。
ライブラリを使用すると、実装が楽になるのはとても良いですね。
昔からあるイメージですが、直近(2024/07時点)も更新されているので、安心して使用できそうです。
② ymlで管理
ymlファイルを準備して、そこで権限を管理する方法です。
以下は一例になります。
default: &default
writer:
controllers:
dashboard:
- index
- new
- create
admin:
controllers:
users:
- index
- edit
- update
development:
<<: *default
役割(ロール)に対して、許可するコントローラーとアクションを記載します。
そうして、ApplicationController
で、controller_name
とaction_name
を受け取り、ymlファイルで許可しているかどうかを判断します。
最小限で始められるので、そこまで多く管理しない場合はオススメかと思います。
ただ、機能が多くなったり、権限も多くなってしまうと、ymlファイルでは管理が難しくなりそうです。
③ DBで管理
権限用のテーブルを用意して、データとして管理します。
- admin_usersテーブル
- role_idを持って、アソシエーションを組む
- rolesテーブル
- 役割をまとめる
- permissionsテーブル
- controller_nameとaction_nameを整理する
- role_permissionsテーブル
- 役割に対して、どのような権限を持たせるかまとめる
大体、上記のようになるかと思います。
これもcontroller_name
・action_name
を受け取り、許可されているかDBをみて判断する実装をします。
これのいいところは、管理画面に機能を作成すれば、リリース無しで権限の付与をすることができます。
DB管理のメリットではあるかと思います。
まとめ
以上、「認可」を実装する方法を3つまとめました。
そのアプリの規模感によっても、実装する方法は変わってくるかと思います。
個人的には、以下の感じに思っています。
- ミニマムに始めるなら
- ymlで管理
- 今後しっかり管理していきたい
- Pundit・cancancan
- DBで管理
上記以外にも、実装する方法はたくさんあるかと思います。
今回はあくまでも例ですので、ご自身の実装しているシステムに合った、あるいはチームで相談の上、実装方針をすり合わせてください。
最後までご覧いただき、ありがとうございました。