認可は、ユーザが許可されたリソースにしかアクセスできないようにする、あらゆる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リポジトリ