Ruby on Rails
CanCanによる承認
サーチ…
前書き
CanCanは、ユーザーの役割から切り離されたRailsに対する単純な承認戦略です。すべての権限は1つの場所に保存されます。
備考
CanCanを使用する前に、宝石を作成するか手動でユーザーを作成することを忘れないでください。 CanCanの最大限の機能を利用するには、管理者ユーザーを作成します。
CanCanを使い始める
CanCanは、特定のリソースへのユーザーアクセスを制限するRuby on Railsの一般的な認可ライブラリです。最新の宝石(CanCanCan)は、死んだプロジェクトCanCanの続きです。
パーミッションはAbility
クラスで定義され、コントローラ、ビュー、ヘルパー、またはコード内の他の場所から使用できます。
アプリケーションに認証サポートを追加するには、CanCanCan gemをGemfileに追加しGemfile
:
gem 'cancancan'
次に、能力クラスを定義します。
# app/models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
end
end
次に、 load_and_authorize_resource
を使用して認可をチェックして、許可されたモデルをコントローラにロードします。
class ArticlesController < ApplicationController
load_and_authorize_resource
def show
# @article is already loaded and authorized
end
end
authorize!
認可を確認するか、例外を発生させる
def show
@article = Article.find(params[:id])
authorize! :read, @article
end
can?
オブジェクトがコントローラ、ビュー、またはヘルパー内の特定のアクションに対して許可されているかどうかをチェックする
<% if can? :update, @article %>
<%= link_to "Edit", edit_article_path(@article) %>
<% end %>
注:これは、署名されたユーザーがcurrent_user
メソッドによって提供されていることを前提としています。
能力の定義
能力は、 can
とcannot
メソッドを使用してAbility
クラスで定義されます。基本的な参照のための以下のコメント付きの例を考えてみましょう。
class Ability
include CanCan::Ability
def initialize(user)
# for any visitor or user
can :read, Article
if user
if user.admin?
# admins can do any action on any model or action
can :manage, :all
else
# regular users can read all content
can :read, :all
# and edit, update and destroy their own user only
can [:edit, :destroy], User, id: user_id
# but cannot read hidden articles
cannot :read, Article, hidden: true
end
else
# only unlogged visitors can visit a sign_up page:
can :read, :sign_up
end
end
end
多数の能力を扱う
能力定義の数が増え始めると、能力ファイルを扱うのがますます困難になります。
これらの問題を処理するための最初の戦略は、この例のように、能力を意味のある方法に移行することです。
class Ability
include CanCan::Ability
def initialize(user)
anyone_abilities
if user
if user.admin?
admin_abilities
else
authenticated_abilities
end
else
guest_abilities
end
end
private
def anyone_abilities
# define abilities for everyone, both logged users and visitors
end
def guest_abilities
# define abilities for visitors only
end
def authenticated_abilities
# define abilities for logged users only
end
def admin_abilities
# define abilities for admins only
end
end
このクラスが十分に大きくなると、別のクラスに分割して、次のようなさまざまな責任を処理できます。
# app/models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
self.merge Abilities::Everyone.new(user)
if user
if user.admin?
self.merge Abilities::Admin.new(user)
else
self.merge Abilities::Authenticated.new(user)
end
else
self.merge Abilities::Guest.new(user)
end
end
end
これらのクラスを次のように定義します。
# app/models/abilities/guest.rb
module Abilities
class Guest
include CanCan::Ability
def initialize(user)
# Abilities for anonymous visitors only
end
end
end
Abilities::Authenticated
、 Abilities::Admin
または他のものを使用します。
すばやく能力をテストする
能力クラスが適切な権限を与えているかどうかを素早くテストしたい場合は、コンソール環境や別のコンテキストでrails環境がロードされた状態で能力を初期化することができます。
test_ability = Ability.new(User.first)
test_ability.can?(:show, Post) #=> true
other_ability = Ability.new(RestrictedUser.first)
other_ability.cannot?(:show, Post) #=> true
詳細: https : //github.com/ryanb/cancan/wiki/Testing-Abilities