プログラミングマガジン

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

  • ホーム
  • Ruby on Rails
  • 【Ruby on Rails】「pundit」について
 
 
     
  • サーバー言語  
    • Ruby
    • Rails
    • PHP
    • Laravel
  •  
  • データ設計  
    • NoSQL
    • SQL
    • RDB設計
    • Oracle
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    •  
    • セキュリティ
    • コンテナ全般
    • Linux
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
    • TypeScript
  •  
  • 設計  
       
    • 実装設計
    •  
    • 認証設計
    • 例外設計
    •  
    • 動画設計
    • DDD
  • 問い合わせ
  

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

10.13

  • miyabisan2
  • コメントを書く

この記事は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
  • コメントを書く
  • Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2022 10.30

    【Rails】「rubocop」の導入

  2. 2019 12.01

    【Rspec】FactoryBotでデータを準備する。

  3. 2019 11.27

    【Ruby on Rails】Railsのエラーメッセージを日本語化する。

  4. 2019 12.01

    【Ruby on Rails】モデルのデータを絞り込む便利機能(scopeも)

  5. 2019 11.30

    【Ruby on Rails】ログイン機能の実装

  6. 2019 12.01

    【Rspec】itのマッチャの種類

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

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

返信をキャンセルする。

【Babel】「presets(プリセット)」について

【Web開発】「direnv」について

RETURN TOP

アーカイブ

  • 2023年3月
  • 2023年1月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年12月
  • 2019年11月
  • 2019年6月
  • 2019年5月
  • 2019年3月
  • 2019年1月
  • 2018年12月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月

カテゴリー

  • .NET Framework
  • Ajax
  • Android
  • Apache
  • API
  • Auth0
  • AWS
  • Babel
  • Babylon.js
  • Bitbucket
  • BootStrap
  • C#
  • C++
  • CGI
  • CSS
  • Cypress
  • C言語
  • DBスペシャリスト
  • DDD
  • DevOps
  • Django
  • Docker
  • Eclipse
  • EKS
  • Firebase
  • Git
  • GitHub Actions
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Heroku
  • HTML
  • HTML5
  • Java
  • JavaScript
  • Javaサーブレット
  • Jekins
  • Jenkins
  • JIRA
  • jQuery
  • JSP
  • JSTL
  • JUnit
  • Kubernetes
  • Laravel
  • linux
  • Mac
  • Maven
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • OAuth
  • Open ID Connect
  • Oracle
  • OS
  • PHP
  • PL/SQL
  • PostgreSQL
  • PowerShell
  • Prisma
  • PWA
  • Python
  • React
  • Recoil
  • Redis
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Salesforce
  • Sass
  • SEO
  • Slack
  • SPA
  • Spring Boot
  • Spring Framework
  • Spring MVC
  • SQL
  • Struts
  • Struts2
  • Sublime Text
  • Swagger
  • Tailwind CSS
  • Three.js
  • Tomcat
  • TypeScript
  • UML
  • Unity
  • UX
  • VB.NET
  • Visual Basic
  • VSCode
  • Vue.js
  • WebGL
  • WebHook
  • webpack
  • WebRTC
  • WebSocket
  • Webサービス開発
  • Webデザイン
  • Web技術
  • wireshark
  • XD
  • XML
  • インフラ
  • オブジェクト指向
  • クラウド
  • ゲームプランニング
  • ゲーム開発
  • サーバー
  • システム開発
  • スクラム
  • スマホアプリ開発
  • セキュリティ
  • その他
  • データベース
  • データ分析
  • デザインパターン
  • テスト
  • ネットワーク
  • バージョン管理システム
  • ハードウェア
  • プログラミング全般
  • マイクロサービス
  • マルチメディア
  • リファクタリング
  • 人間関係
  • 会計知識
  • 体調管理
  • 副業
  • 動画
  • 国際化
  • 応用情報
  • 情報処理技術者試験
  • 文字コード
  • 日常生活
  • 未分類
  • 業務知識
  • 要件定義
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | Wordpress Thema | @