punditを使ってみる
punditとは
punditは認証系のgemの一種であり、対象のリソースに対して何を(誰を)許可するのかを定義することができます。
punditをインストール
gem 'pundit'
$ bundle install
punditの初期設定
app/controllers/application_controller.rb
にPunditをincludeする。
(対象controllerの継承元でpunditをincludeしておく。)
include Pundit
$ rails g pundit:install
を実行すると、app/policies
ディレクトリが作成されます。
例えばhogehogeコントローラーへのアクセス制御を掛けたいとき、
$ rails g pundit:policy hogehoge
を実行し、policyファイルapp/policies/hogehoge_policy.rb
を作成されます。
認証に失敗する
hogehoge_controller.rb
のindexアクションで、authorize貼ってみる。
# コントローラーのindexアクションにてauthorizeメソッドを呼び出す def index authorize HogeHoge end # app/policies/hogehoge_policy.rbでindexをfalse(認証拒否)にしておく class HogeHogePolicy < ApplicationPolicy def index? false end
認証拒否しておくとPundit::NotAuthorizedError
が発生します。
認証に成功する
# hogehoges_controller def index authorize HogeHoge end def new @hogehoge = HogeHoge.new authorize @hogehoge end def create @hogehoge = HogeHoge.new(permitted_attributes(HogeHoge)) end def update @hogehoge = HogeHoge.find(params[:id]) @hogehoge.update(permitted_attributes(@hogehoge)) end policy(:hogehoge).fugafuga?(引数) # app/policies/hogehoge_policy.rb class HogeHogePolicy < ApplicationPolicy # indexアクション時のuser権限を確認しています。 def index? user.staff? || user.admin? end # create, editアクションを実行できるかをチェックしています(newができればcreateもできる、editができればupdateもできる) def new? create? end def edit? update? end # 独自でメソッドを作ることもできる def fugafuga?(引数) end private # pundit側でストロングパラメータを設定できる def permitted_attributes [:strong_parameterA, :strong_parameterB] end end