2014年6月20日

Rails 4.1 で Cancanに代わる権限認可ライブラリライブラリ Pundit

http://blog.n-z.jp/blog/2013-10-08-rails4-authorization.html
上記URI によれば、Cancan の Rails 4.1 対応があまり進んでいないらしい。

実際に Cancan の github を見てみると Issues と Pull Requests が溜まっています。
https://github.com/ryanb/cancan

そこで、http://blog.n-z.jp/blog/2013-10-08-rails4-authorization.html を参考に
pundit という gem を導入しました。

実際 pudit を使用して作成しましたが、gemを導入しなくていいくらいシンプルな考えで認可が管理できます。

Readme にも書かれていますが、
class ApplicationPolicy
  attr_reader :user, :record
  def initialize(user, post)
    @user = user
    @post = record
  end
  def index?
    post_public?
  end
  def show?
    user_signed_in?
  end
end

こんな感じで、コントローラー毎に ?のついたメソッドを作成して、
そのコントローラーで
  def index
    @policy = PostPolicy.new(current_user, Post)
    return render :file => "public/401.html", :layout => false, :status => :unauthorized unless @policy.index?

として、カレントユーザーの権限を判定します。(※ここではユーザー管理は devise を使っています)

また、コントローラー毎のメソッドだけでなく、
post_public?
user_signed_in?
等、ユーザーの状態を判定するメソッド(例: user_signed_in?)や、インスタンスの状態を判定するメソッド(例: post_public?)
も public メソッドとして追加してみましょう。

上記のコントローラーで @policy としているので、ビューで、権限判定が必要な部分は、全てこれを使います。

こうすると権限は、全て policyクラスに押し込めて便利です。