サーチ…


前書き

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メソッドによって提供されていることを前提としています。

能力の定義

能力は、 cancannotメソッドを使用して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::AuthenticatedAbilities::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



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow