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
-,

執筆者:

関連記事

Railsでdocxをフォーマット指定でダウンロードできるようにする

タイトルだけだと何のことだかわからない railsでdocuments/2とかをGETメソッドで呼び出すとdocumentsコントローラーのshowメソッドを呼び出すようになってるんだけど、docum …

no image

Mongoidで地理情報インデックスを使おうとしたけどうまくいかない

試したgem mongoid_geo mongoid_geospatial 試してないgem mongoid_spacial

no image

Railsで使える便利なナビゲーション~simple-navigation

RubyでFaye-websocketを試す

By: Jenny Ondioline – CC BY 2.0 目次1 公式2 インストール3 サーバ側4 クライアント側5 エラー 公式 faye-websocketは、fayeからwe …

今度こそRails3.2からdocxを生成する

  前提 Rubyからdocxを生成する 前回、イキオイアマって自分でdocxを生成する簡単なライブラリを作ってしまった.(なんて車輪の再発明 今回はこれをRailsから利用してみる. 目次 …