Posted at

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

More than 5 years have passed since last update.

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


base_controller.rb

class BaseController < ApplicationController

# 権限チェック
authorize_resource

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

end


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

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


hoge_upload_controller.rb

class HogeUploadController < BaseController

def index
end
end

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

Rendering 500 with exception: uninitialized constant HogeUpload

この問題を回避するためには、該当コントローラについては authorize_resouce を行わないように修正する必要があります。

また、その場合は自前で権限チェックの処理をフィルタなりで実装する必要があります。

たとえば、前述の 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