Ruby on Rails
कैनकन के साथ प्राधिकरण
खोज…
परिचय
कैन रल्स के लिए एक सरल प्राधिकरण रणनीति है जिसे उपयोगकर्ता भूमिकाओं से अलग किया गया है। सभी अनुमतियाँ एक ही स्थान पर संग्रहीत हैं।
टिप्पणियों
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