수색…


소개

CanCan 은 Rails에 대한 간단한 권한 부여 전략으로 사용자 역할과 분리되어 있습니다. 모든 사용 권한은 단일 위치에 저장됩니다.

비고

CanCan을 사용하기 전에 보석을 고안하거나 수동으로 사용자를 생성하는 것을 잊지 마십시오. CanCan의 기능을 최대한 활용하려면 관리자 권한을 만드십시오.

CanCan 시작하기

CanCan 은 특정 리소스에 대한 사용자 액세스를 제한하는 Ruby on Rails에 대한 인기있는 권한 부여 라이브러리입니다. 최신 보석 (CanCanCan)은 죽은 프로젝트 CanCan의 연속물 입니다.

권한은 Ability 클래스에 정의되어 있으며 컨트롤러, 뷰, 헬퍼 또는 코드의 다른 위치에서 사용할 수 있습니다.

응용 프로그램에 인증 지원을 추가하려면에 CanCanCan 보석 추가 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::Authenticated , Abilities::Admin 또는 다른 것들을 사용합니다.

신속하게 능력 테스트

능력 클래스가 올바른 권한을 부여하는지 신속하게 테스트하려면 레일 환경이로드 된 콘솔 또는 다른 컨텍스트에서 능력을 초기화 할 수 있습니다. 테스트 할 사용자 인스턴스를 전달하기 만하면됩니다.

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/ 테스트 - 유용성



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow