プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Ruby on Rails
  • 【Ruby on Rails】「pundit」について
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Ruby on Rails】「pundit」について

10.13

  • miyabisan2
  • 1件のコメント

この記事は2分で読めます

punditとは?

Railsにおける認可の仕組みです。

cancancanとの違い

cancancanはユーザに対して、どんなアクションが許可するかを定義する(コントローラ寄り)のに対して、Punditではリソースに対して誰が許可されるのかを定義する(モデル寄り)。

基本的な使い方

1.Punditをincludeする。

punditを使いたいコントローラでpubditをincludeします。基本的にはbaseコントローラみたいな物を作ってそこに宣言する形が多いでしょう。

1
2
3
class 使いたいコントローラー名 < ActionController::Base
  include Pundit
end

2.ApplicationPolicyを作成する。

下記コマンドを実行すれば、「app/policies/」配下に「application_policy.rb」が作成されます。

1
rails g pundit:install

生成される内容は下記です。

1
2
3
4
5
6
7
8
9
10
11
12
class ApplicationPolicy
  attr_reader :user, :record
 
  def initialize(user, record)
    @user = user
    @record = record
  end
 
  def index?
    false
  end
end

このApplicationPolicyを継承して個々のPolicyを作成していきます。

initializeの@user

current_user(アクセスしているユーザー)が割り当てられます。逆に言えば、モデルにcurrent_userという変数にアクセスするユーザーが割り当てられていないとエラーになってしまうので、割り当てるようにしましょう。(基本的にはdeviseで使われているユーザー変数がデフォルトでcurrent_userになっているのでそれで自動対応になると思います。)

initializeの@record

対応するモデル(リソースオブジェクト)のインスタンスを割り当てます。

3.ポリシーファイル(コントローラ名Policy)を作成する。

app/policyフォルダの直下に「コントローラ名Policy.rb」というポリシーファイルを作成します。

アクション名 + ?

戻り値がtrueなら認可、戻り値がfalseなら拒否となります。拒否した場合は、「Pundit::NotAuthorizedError」という例外が投げられます。

例えば、「record.user_id == user.id」

4.コントローラで対象の権限があるかチェックする。

authorize モデル(リソースオブジェクト)

対象のリソースに対して権限があるかどうかチェックしてくれます。コントローラで使います。

Scope

ApplicationPolicyの中にデフォルトでScopeというクラスも含まれています。用途としては対象のモデルだけでなくモデルの中に含まれている属性まで加味して表示させるリソースを制御したい場合に使用します。(例えば、管理者権限を持っているユーザーに対しては管理者情報も表示させる等)

1
2
3
4
5
6
7
8
9
10
11
12
  class Scope
    attr_reader :user, :scope
 
    def initialize(user, scope)
      @user = user
      @scope = scope
    end
 
    def resolve
      scope.all
    end
  end

具体的にはresolveメソッドにてユーザーの属性による分岐をさせます。(scopeというのが全体の情報です。)

1
2
3
4
5
6
7
def resolve
  if 管理者
    scope.all
  else
    scope.all.find(1)
  end
end

コントローラー側からpolicy_scopeメソッドを使って呼び出します。引き渡したユーザーによってresolveメソッドの結果を返してくれます。

1
2
3
  def index
    @users = policy_scope(User)
  end

スポンサーリンク
  • 2020 10.13
  • miyabisan2
  • 1件のコメント
  • Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2021 01.09

    【Ruby on Rails】「bullet」、「N+1問題」について

  2. 2019 11.23

    【Ruby on Rails】Bundler、Gemfileについて

  3. 2019 12.07

    【Ruby on Rails】「ページング」の実装(kaminari)

  4. 2020 11.18

    【Ruby on Rails】「devise」の基本クラスについて

  5. 2019 12.07

    【Ruby on Rails】「Active Job」でジョブを非同期実行する。(Sidekiq)

  6. 2018 06.19

    【Ruby on Rails】の「O/Rマッパー」である「ActiveRecord(アクティブレコード)」、Scaffoldingで雛形アプリ作成まで

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Babel】Babelの基本、「presets(プリ…

【Ruby】「コメント」、「ヒアドキュメント」、「マジ…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー