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