Ruby on Rails
CanCan을 통한 권한 부여
수색…
소개
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
메소드에 의해 제공된다고 가정합니다.
능력 정의하기
능력은 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
또는 다른 것들을 사용합니다.
신속하게 능력 테스트
능력 클래스가 올바른 권한을 부여하는지 신속하게 테스트하려면 레일 환경이로드 된 콘솔 또는 다른 컨텍스트에서 능력을 초기화 할 수 있습니다. 테스트 할 사용자 인스턴스를 전달하기 만하면됩니다.
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/ 테스트 - 유용성