authorizeメソッドとは
authorizeメソッドとは、Pundit
というgemを導入することにより、Rubyで使用できるメソッドのこと。
役割
引数のオブジェクトの認可を確認するメソッドとして、よく使用される。
例えば、下記のauthorize(current_site)
の場合、
authorizeメソッドの引数である(current_site)
が、認可されているかどうかを確認するメソッドとして、authorize
メソッドが使用されている。
(current_site
サイトにログインしているユーザーがadminかそれ以外かの認可の確認を行っている。)
authorizeメソッドの呼び出し元であるコントローラー
class Admin::Site::AttachmentsController < ApplicationController
def destroy
authorize(current_site)
image = ActiveStorage::Attachment.find(params[:id])
image.purge
redirect_to edit_admin_site_path
end
end
SiteオブジェクトのPolicy
class SitePolicy < ApplicationPolicy
def update?
user.admin?
end
def destroy?
user.admin?
end
class Scope < Scope
def resolve
scope
end
end
end
authorizeメソッドが呼び出された際の挙動
①authorizeメソッドの呼び出し
authorize(current_site)
メソッドで、Punditによりcurrent_site
オブジェクトに対する認可チェックが要求される。
②ポリシークラスの決定
Punditは、authorize
メソッドに渡されたオブジェクトのクラス(引数のクラス)に基づいて、対応するポリシークラスを決定する。
この例では、current_site
オブジェクトがSite
クラスのインスタンスであるため、SitePolicy
クラスが使用される。
③ アクション名に基づくポリシーメソッドの呼び出し
authorize
メソッドは、呼び出されたコントローラーアクション名に基づいて、対応するポリシーメソッドを呼び出す。
この場合、**destroy
**アクションに対応するため、SitePolicy
クラス内のdestroy?
メソッドが呼び出される。
④destroy?
メソッドの実行
SitePolicy#destroy?
メソッドが実行される。このメソッド内で、user.admin?
を評価し、現在のユーザーが管理者であるかどうかをチェックする。user
はPunditによって自動的に現在のユーザー(通常はcurrent_user
メソッドによって提供される)にセットされる。
⑤認可の結果
-
許可:
destroy?
メソッドがtrue
を返した場合、ユーザーはdestroy
アクションを実行する権限があるとみなされ、処理は続行される。 -
拒否:
destroy?
メソッドがfalse
を返した場合、PunditはPundit::NotAuthorizedError
例外を発生させる。この例外は通常、アプリケーションコントローラーで捕捉され、適切なエラーメッセージと共にユーザーをエラーページや別のページへリダイレクトさせる処理が行われる。
まとめ
authorize(current_site)
は、SitePolicy
クラスのdestroy?
メソッドを通じてcurrent_site
オブジェクトに対するユーザーの認可をチェックする。このプロセスは、ユーザーが特定のアクションを実行する権限を持っているかどうかを確認するために、Punditが提供する認可システムの一部である。
要点
実行されるpolicy
クラスは、authorize
メソッドの引数のオブジェクトクラスの名前に命名されたクラスである。
※誤りがあれば、教えていただけますと幸いです。🙏
参考記事