紙一重の積み重ね

35歳のエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【Rails5】Punditを使って権限管理の機能を実現する

f:id:yokoyantech:20190108135720p:plain

はじめに

Punditを使った権限管理の実装方法のメモ。

やりたいこと

権限管理の機能を簡単に実装したい。

実現方法

Punditを使う。

github.com

実装

application_controller

  • Punditをインクルードする
class ApplicationController < ActionController::Base
  include Pundit

application全体のpolicy

  • policyクラスをapp/policies/に配置する
  • ApplicationPolicyで基本的なpolicyを定義する
class ApplicationPolicy
  attr_reader :user, :record

  def initialize(user, record)
    @user = user
    @record = record
  end

  def index?
    user.accessible?(record)
  end

  ・・・

end

Model独自のpolicyを定義する

  • ApplicationPolicyを継承する
  • recordはモデルオブジェクトが入る
class HogePolicy < ApplicationPolicy
  def edit?
    record.fuga_flg && user.accessible?(record) || user.hoge_admin?
  end
end

controllerの実装

  • before_actionで権限チェックすると便利
  • authorizeメソッドは、引数に渡した@hogeから対応するHogePolicyを確認して、current_userrecordを返す
class HogeController < ApplicationController
  before_action :authorize_user

  def authorize_user
    set_hoge if params[:id]
    authorize @hoge
  end
end