CanCanのload_and_authorize_resourceについて

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
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に任せて、削除できます。

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
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でメソッドを指定します。

1
2
3
4
5
class HogeController < ApplicationController
  load_and_authorize_resource
  skip_load_and_authorize_resource :only => :search_hoge
  ...(略)
end

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

1
2
3
4
5
6
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 | タグ   | パーマリンク

コメントを残す

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