4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

authorizeメソッドについて

Last updated at Posted at 2024-02-25

authorizeメソッドとは

authorizeメソッドとは、Punditというgemを導入することにより、Rubyで使用できるメソッドのこと。

役割

引数のオブジェクトの認可を確認するメソッドとして、よく使用される。

例えば、下記のauthorize(current_site)の場合、
authorizeメソッドの引数である(current_site)が、認可されているかどうかを確認するメソッドとして、authorizeメソッドが使用されている。

current_siteサイトにログインしているユーザーがadminかそれ以外かの認可の確認を行っている。)

authorizeメソッドの呼び出し元であるコントローラー

app/controllers/admin/site/attachments_controller.rb
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

app/policies/site_policy.rb
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メソッドの引数のオブジェクトクラスの名前に命名されたクラスである。

※誤りがあれば、教えていただけますと幸いです。🙏

参考記事

4
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?