LoginSignup
19
19

More than 1 year has passed since last update.

CanCanを使ってリソースと無関係なコントローラの権限チェックする

Last updated at Posted at 2013-04-17

CanCanを使って権限チェックを実装している場合、以下のように基底のコントローラで権限チェックを行うようになっていると思います。

base_controller.rb
class BaseController < ApplicationController
  # 権限チェック
  authorize_resource

  # いろいろな共通ロジック …

end

REST の原則に従ってリソース単位でコントローラが定義されていれば、これで問題なく権限チェックが行えます。

しかし、以下のようにリソースと無関係なコントローラを定義したい場合もあると思います。

hoge_upload_controller.rb
class HogeUploadController < BaseController
	def index
    end
end

しかし、そのようなコントローラを定義したとたん、前述の authorize_resource が存在しないリソースに対して権限チェックしようとして、以下のようなエラーが発生します。

Rendering 500 with exception: uninitialized constant HogeUpload

この問題を回避するためには、該当コントローラについては authorize_resource を行わないように修正する必要があります。
また、その場合は自前で権限チェックの処理をフィルタなりで実装する必要があります。
たとえば、前述の hoge_upload_controller.rb は以下のように修正します。

hoge_upload_controller.rb
class HogeUploadController < BaseController
  # 権限チェックをスキップ
  skip_authorize_resource
  # 自前で権限チェック
  before_filter :check_authorization

  def index
  end

  private
  def check_authorization
     authorize! :manage, :all
  end
end

参考

Authorizing controller actions
https://github.com/ryanb/cancan/wiki/Authorizing-controller-actions

Non RESTful Controllers
https://github.com/ryanb/cancan/wiki/Non-RESTful-Controllers

19
19
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
19