Railsで使えるGem

Rails3.2でユーザー権限を細かく設定~Devise + cancan

投稿日:

 

 

 

参考

cancan でモテカワ♥愛され権限管理

How To: Integrate with CanCan for roles management

 

ユーザーの役割を決めて、役割ごとにできる権限を設定したい.

これはcancanというgemで簡単にできる.

構想

自分のアプリに次のような権限を設定したい

  • admin すべての権限をもつ管理人(ユーザー管理・テンプレート管理・ドキュメント管理)
  • manager テンプレートをいじれる人(テンプレート管理・ドキュメント管理)
  • user テンプレートを使ってドキュメントを作る人(テンプレート読む・ドキュメント管理)

準備

migration

既存のUserモデルにroleカラムを加える

rake db:migrate

model

roleにアクセスできるようにする

 view

roleを選択できるようにする

一覧表にも表示する

Factory初期モデルも訂正

 データベースのリセット

前のデータはroleがnilなのでajaxでうまく表示できないはず

resetしたらprepareしないと一気にテストが真っ赤になる

メソッド

好みで

結局、case whenにしたので使わなかった

 

cancanのインストールと設定

Gemfile

bundle

generate

 app/model/ability.rb

使い方はだいたいここに書いてある

# Define abilities for the passed in user here. For example:
#
# user ||= User.new # guest user (not logged in)
# if user.admin?
# can :manage, :all
# else
# can :read, :all
# end
#
# The first argument to can is the action you are giving the user permission to do.
# If you pass :manage it will apply to every action. Other common actions here are
# :read, :create, :update and :destroy.
#
# The second argument is the resource the user can perform the action on. If you pass
# :all it will apply to every resource. Otherwise pass a Ruby class of the resource.
#
# The third argument is an optional hash of conditions to further filter the objects.
# For example, here the user can only update published articles.
#
# can :update, Article, :published => true
#
# See the wiki for details: github.com/ryanb/cancan/wiki/Defining-Abilities

以下、適当な訳

認証されたユーザーのためにここで権限を定義できます.

 

はじめに、’can’はあなたがユーザーに許可したアクションです.もし、あなたが:passを与えたなら、それはすべてのアクションに適用されます.そのほかよくあるアクションとして、:read、:create、:update、:destroyがあります.

次に、ユーザーがアクションを行える対象についてです.もし、あなたが:allを与えたならすべての対象に対して適用されます.そうでなければRubyのクラスを対象として与えてください.

第3に、オプションとしてハッシュでオブジェクトに更にフィルタをかけることができます.例えば、これはユーザーが発行済み(published)の記事(article)のみ更新できます.

詳細はwikiを見てください.

 

abiltyの設定

みるとおりuserはログインしてないuserも含むんだけど、ここで困った.deviseのサインイン・サインアウト権限の書き方がわからない.

abilityの適用

これはコントローラーに次の1行を書く

beforeフィルターで先にdeviseでログインを判断したあとにした.

cancanはデフォルトで権限外のことをしようとするとエラーを吐く.
ので、先にdeviseの機能でログインしてない人はエラーじゃなくて、サインイン画面に飛ばしたいから.

同じくapplication_controllerに書くとdeviseのセッション機能までアクセス制限されてしまうので、悩んだけど、結局、自分で書いたほかのコントローラーの最初に付け足した.もっと賢い方法があるはず.

viewの細かい設定

viewの中でこの権限がある場合はこれを表示したいという場合、便利な’can?’ヘルパーが用意されている.

と思ったら、テスト通ってなかった!

TemplateがAction viewの予約語っぽい扱いらしい

Rails予約語一覧

この修正は激しくめんどうくさい

ActionViewで自分のTemplateモデルを呼べないらしいことがわかったので、当面の問題はUser.roleで判定することにした.しかし、潜在的なバグを含んでいるので修正しなければならない(遠い目).

cancanのテスト

アビリティのテストじゃなくて他のところをテストするのにとりあえずアビリティを持たせたい場合

 

-Railsで使えるGem
-,

執筆者:

関連記事

no image

Rails3.2でajaxなフォルダツリーを導入する4~dynatree-rails & Drag’n’Drop

wwwendt.de/tech/dynatree/doc/dynatree-doc.html wwwendt.de/tech/dynatree/doc/samples.html 今日はドラッグアンドド …

RailsでOAuthを使うには~OmniAuth

By: Freenerd – CC BY 2.0   github.com/intridea/omniauth   目次1 OmniAuthの受け持つ役割2 Rails …

backbone-relationalをJasmineでテストしてみた

no image

Rubyでxmlの要素の追加など~nokogiri

目次1 はじめに2 文字列をパースしてxmlとして読み込んでそのままxmlとして出力する3 nodeの追加4 nodesetの作成と追加5 DocumentFragmentの作成と追加 はじめに 参考 …

backbone-railsのscaffoldで生成されるコードでルーティングとCRUDの処理をどうやってるのか読んでみた

By: asobi tsuchiya   目次1 はじめに2 サンプルの準備3 初期化4 ルーター5 READ6 CREATE7 UPDATE8 DELETE はじめに backbone-r …