खोज…


परिचय

कैन रल्स के लिए एक सरल प्राधिकरण रणनीति है जिसे उपयोगकर्ता भूमिकाओं से अलग किया गया है। सभी अनुमतियाँ एक ही स्थान पर संग्रहीत हैं।

टिप्पणियों

CanCan का उपयोग करने से पहले उपयोगकर्ताओं को या तो मणि मणि या मैन्युअल रूप से बनाना न भूलें। CanCan की अधिकतम कार्यक्षमता प्राप्त करने के लिए एक व्यवस्थापक उपयोगकर्ता बनाएं।

CanCan के साथ आरंभ करना

कैनकन रूबी ऑन रेल्स के लिए एक लोकप्रिय प्राधिकरण पुस्तकालय है जो विशिष्ट संसाधनों के लिए उपयोगकर्ता की पहुंच को प्रतिबंधित करता है। नवीनतम मणि (CanCanCan) मृत परियोजना के एक निरंतरता है कैनकैन

अनुमतियाँ Ability वर्ग में परिभाषित की जाती हैं और कोड में नियंत्रकों, विचारों, सहायकों, या किसी अन्य स्थान से उपयोग की जा सकती हैं।

किसी ऐप में प्राधिकरण समर्थन जोड़ने के लिए, CanCanCan रत्न को 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 कर can 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::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/Testing-Abilities



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow