CanCanのload_and_authorize_resourceについて

CanCanで、そのリソースへのアクセス権限チェックを行う関数として、load_and_authorize_resourceがあります。
これを使うと、アクセス権限をチェックした上で、違反した場合は例外送りにしてくれます。

class HogeController < ApplicationController
  load_and_authorize_resource

  def index
    ...(略)
  end

  def show
    ...(略)
  end

  def new
    ...(略)
  end

  def edit
    ...(略)
  end

  ...(略)
end

しかも、このload_and_authorize_resourceはすごい機能があって、文字通りなんですが、リソースをロードしてくれます。つまり、scaffoldで定義していたような処理を勝手にやってくれます。index, show, new, editみたいなメソッドはcancanに任せて、削除できます。

class HogeController < ApplicationController
  load_and_authorize_resource
  ...(略) # こんなに短くなる!
end

しかし、kaminariを使っている場合など、イレギュラーなものには対応してないっぽくて、indexメソッドを定義する必要があります。

class HogeController < ApplicationController
  load_and_authorize_resource

  def index
    params[:page] ||= 1
    @hoge = Hoge.page(params[:page])

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @hoge }
    end
  end

  ...(略) # まぁこんなところです。
end

また、一部のメソッドでは認証したくないという場合、skip_load_and_authorize_resourceメソッドが使えます。これだけ定義すると、全部スキップしようとするので、:onlyでメソッドを指定します。

class HogeController < ApplicationController
  load_and_authorize_resource
  skip_load_and_authorize_resource :only => :search_hoge
  ...(略)
end

ハマりがちなんですが、CanCanの権限チェックだけに注視していると、Deviseの認証チェックにひっかかってたりする場合があるので、skipなんちゃらをするときは、Deviseのほうもskipする必要があるでしょう。

class HogeController < ApplicationController
  skip_authorization_check :only => :search_hoge
  load_and_authorize_resource
  skip_load_and_authorize_resource :only => :search_hoge
  ...(略)
end

こんな感じですかねぇ。


カテゴリー Ruby, Ruby on Rails | タグ   | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です