Rails認可入門|Pundit導入と基本をやさしく解説(policy作成・authorize・verify_authorized)
生徒
「Railsで、使っていい人とダメな人を分ける仕組みってありますか?」
先生
「あります。Railsでは“認可”と呼ばれていて、Punditというライブラリがよく使われます。」
生徒
「ログインとは違うんですか?」
先生
「ログインは本人確認、認可は“その人がその操作をしていいか”を判断する仕組みです。」
1. Railsにおける認可とは?
Railsの認可(Authorization)とは、「このユーザーは、この操作をしても良いか」を判断する仕組みです。例えば、ブログの記事を読むだけの人と編集できる人を分けたい場合に使います。
よく似た言葉に認証(Authentication)がありますが、こちらは「誰か」を確認する仕組みです。ログイン画面でIDとパスワードを入力するのが認証、ログイン後に何ができるか決めるのが認可です。
Punditは、Railsで認可をシンプルに書くための定番ライブラリで、ポリシー(policy)というクラスを使って判断ルールをまとめます。
2. Punditとは何か?初心者向けに説明
Punditは「この人はOK?NG?」を判断するルールブックのようなものです。ルールはPolicyクラスに書きます。
たとえば「自分が書いた記事だけ編集できる」というルールがあるとします。この判断をコントローラに直接書くと、コードがごちゃごちゃします。Punditを使うと、判断を別の場所にまとめられます。
Rails・認可・Pundit・ポリシー設計というキーワードは、Rails学習で必ず出てくる重要ポイントです。
3. Punditのインストールと初期設定
まずはPunditをRailsアプリに追加します。GemfileにPunditを追加して、インストールします。
gem 'pundit'
次に、コマンドを実行します。
bundle install
ApplicationControllerにPunditを読み込みます。
class ApplicationController < ActionController::Base
include Pundit
end
これでRailsアプリ全体でPunditが使える状態になります。
4. policyファイルの作成と基本構造
Punditでは、モデルごとに〇〇Policyというクラスを作ります。たとえばArticleモデルならArticlePolicyです。
ファイルはapp/policiesフォルダに作ります。
class ArticlePolicy
attr_reader :user, :article
def initialize(user, article)
@user = user
@article = article
end
def update?
user == article.user
end
end
ここでは「ログイン中のユーザーが、記事の持ち主なら更新OK」というルールを書いています。update?のように、アクション名+?でメソッドを作るのが特徴です。
5. authorizeメソッドの使い方
次に、コントローラでauthorizeを使います。これは「この操作、許可されてる?」とPunditに聞く命令です。
def update
@article = Article.find(params[:id])
authorize @article
@article.update(article_params)
end
この1行で、ArticlePolicyのupdate?が自動的に呼ばれます。もしNGなら、エラーが発生して処理が止まります。
初心者の方は「authorizeはチェック係」と覚えると理解しやすいです。
6. verify_authorizedで書き忘れを防ぐ
verify_authorizedは、「ちゃんとauthorizeを書いた?」を確認する仕組みです。書き忘れを防ぐ安全装置のようなものです。
class ApplicationController < ActionController::Base
include Pundit
after_action :verify_authorized
end
これを設定すると、authorizeを書いていないアクションがあるとエラーになります。Rails・Pundit・セキュリティを意識する上で、とても大切な考え方です。
7. 初心者がつまずきやすいポイント
Pundit初心者がよく混乱するのが、「どこに何を書くか」です。判断ルールはpolicy、実行するのはcontroller、と役割を分けるのが基本です。
また、policyのメソッド名とcontrollerのアクション名が対応している点も重要です。updateならupdate?、showならshow?という形になります。
Rails認可・Pundit導入・policy設計を理解すると、アプリの安全性が一気に高まります。
8. 認可を使うメリットと考え方
認可をしっかり書くことで、「見てはいけない情報を守る」「操作ミスを防ぐ」などの効果があります。特にRailsアプリでは、認可を書かないと誰でも操作できてしまう危険があります。
Punditはシンプルで読みやすく、初心者でも理解しやすいのが特徴です。Rails・認可・Pundit・authorize・verify_authorizedというキーワードは、実務でも頻繁に使われます。