2011年8月18日木曜日

rails cancanを試してみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
cancanは編集や削除権限などを付与して管理者はただのユーザーといった役割とあたえることができる。deviceとの併用も便利みたいだ

以下を参考

・gemfileに以下を記述してbundleインストール
gem 'cancan'
bundle install

・テスト用記事
rails g scaffold article title:string body:text

rake db:migrate

・abilityモデルを作成
rails g cancan:ability

・ablitityモデルに権限を設定する。
まずは読むだけのread権限(update,destroyができない)

#ability.rb
class Ability
include CanCan::Ability
def initialize(user)
can :read, :all
end
end

・articleのindexのedit,destroyリンク部分を修正、update、destory権限がなければedit、destroyリンクは見えない状態にする。

<% if can? :update,@articles %>
<%= link_to 'Edit', edit_article_path(article) %>
<% end %>
<% if can? :destroy,@articles %>
<%= link_to 'Destroy', article, :confirm => 'Are you sure?', :method => :delete %>
<% end %>

この状態でindexページを見るとedit、destroyリンクが消えてくれました。

ただ、このままではeditアクションのurlを直接指定すると編集できてしまう問題があるので
以下のように権限がなければ例外エラーを発生させる。

def edit
@article = Article.find(params[:id])
unauthorized! if cannot? :edit, @article
end

でもアクションごとに設定するのはめんどくさいので コントローラーごと設定できる。
load_and_aruthorize_resourceを記述する。

class ArticlesController < ApplicationController
load_and_authorize_resource

/articles/1/editを直接URL指定しても
アクセスする権限がない以下のエラーがでて編集できないようにできた。

「You are not authorized to access this page.」

ここからhttp://d.hatena.ne.jp/dimros/20110326/1301145073参照させてもらいました。

admin権限と見るだけのview権限を試す。

Userモデルに権限ROLESと、権限を確認するrole?を設定
まずはUserモデルにroleのcolomの追加

rails g migration add_role_to_users role:string
rake db:migrate

rails g devise:viewsでビューを書き換える
devise/registrationsのeditとnewに権限選択できるセレクターを追加

<%= f.label :role %>
<%= f.collection_select :role, User::ROLES, :to_s, :humanize%>

UserModelに以下を追加
attr_accessible :role
ROLES=%w[admin viewer]

def self.role?(role)
ROLES.include? role.to_s
end

権限として、adminの場合は全て使えて、viewerは見ることしかできないように権限設定
user ||= User.new # guest user (not logged in)
if user.role == "admin"
can :manage, :all
else
can :read, :all
end

でadminでサインインするとすべてのshow,edit,destroyが表示され
viewerでサインインするとshowだけが表示されました。
便利便利。

・こっちはadmin


・こっちはviewer、見るだけのひと

0 件のコメント:

コメントを投稿