Pundit GemでRailsの認可をマスターする

Pundit GemでRailsの認可をマスターする

認可は、ユーザが許可されたリソースにしかアクセスできないようにする、あらゆるWebアプリケーションの重要なコンポーネントです。PunditはRuby on Rails用の認可ライブラリとして人気があり、開発者はきめ細かいアクセスルールを定義することができます。この記事では、Ruby on RailsでPundit gemを使って認可を行う方法を説明します。 Railsアプリケーション例を挙げて説明する。

ステップ・バイ・ステップ・ガイド 

1.RailsアプリケーションにPunditを追加する

まず、GemfileにPunditを追加し、bundle installを実行する:

宝石「評論家


バンドルインストール

次に、Punditのインストールファイルを生成します:

rails generate pundit:install

これは application_policy.rb ファイルを app/policies ディレクトリに置く。

2.ポリシーの定義
Punditのポリシーは、認可ロジックをカプセル化したPORO(Plain Old Ruby Objects)です。それぞれのポリシーはアプリケーションのモデルに対応しています。簡単な例として、Postモデルがあり、それに対する認可ルールを定義する場合を考えてみましょう。

Postモデルのポリシーを作成する:

railsはpundit:policy postを生成する

これにより post_policy.rb ファイルを作成する。

3.認証ロジックの実装
post_policy.rbファイルを開き、認可ルールを定義する:

class PostPolicy < ApplicationPolicy
  def index?
    true
  終了

  def show?
    true
  終了

  def create?
    user.present?
  end

  def update?
    user.present? && user == record.user
  end

  def destroy?
    user.present? && user == record.user
  end
終了

ここでは、各アクション(index?、show?、create?、update?、destroy?)に対応するメソッドを定義します。これらのメソッドは、ユーザーとアクセスされているレコードに基づいて真か偽を返します。

4.コントローラでのポリシーの使用
コントローラでは、Pundit を使ってアクションを認可することができます。まず、Pundit モジュールを ApplicationController にインクルードします:

class ApplicationController < ActionController::Base
パンディット
終わり

そして、authorize メソッドを使用して PostsController の認可をチェックします:

class PostsController < ApplicationController
  before_action :authenticate_user!
  before_action :set_post, only: [:show, :edit, :update, :destroy] です。

  def index
    posts = Post.all
    postsを認証する
  終了

  def show
  終了

  def new
    post = Post.new
    postを認可する
  終了

  def create
    post = current_user.posts.build(post_params)
    postを認可する
    if @post.save
      redirect_to @post, notice: '投稿は正常に作成されました。'
    else
      render :new
    終了
  終了

  def edit
    投稿を承認する
  終了

  def update
    postを認可する
    if @post.update(post_params)
      redirect_to @post, notice: '投稿は正常に更新されました。'
    else
      render :edit
    end
  終了

  def destroy
    postを認可する
    post.destroy
    redirect_to posts_url, notice: '投稿は正常に破棄されました。'
  終了

  プライベート

  def set_post
    post = Post.find(params[:id])
  終了

  def post_params
    params.require(:post).permit(:title, :body)
  end
終了

このコントローラでは、アクションを実行する前にauthorizeを使用して権限をチェックしています。

5.不正アクセスへの対応
Pundit は、ユーザーがアクションを実行する権限がない場合に Pundit::NotAuthorizedError を発生させます。このエラーは、ApplicationController でグローバルに扱うことができます:

class ApplicationController < ActionController::Base
  インクルード Pundit

  rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized

  private

  def user_not_authorized
    flash[:alert] = "このアクションを実行する権限がありません。"
    redirect_to(request.referrer || root_path)
  エンド
終了

こうすることで、ユーザーが不正なアクションを実行しようとすると、エラーメッセージとともにリダイレクトされる。

結論

Railsの認可にPunditを使うと、アプリケーションのリソースへのアクセスを強力かつ柔軟に制御できます。ポリシーを定義してコントローラで使用することで、ユーザが許可されたアクションしか実行できないようにすることができます。ここでは基本的なことを説明しましたが、Punditはスコープやカスタムポリシージェネレータなど、より複雑なシナリオもサポートしています。

より詳細な情報については Pundit GitHubリポジトリ

関連記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

jaJapanese