2012-01-20 9 views
6

मैं admin_users सेट करता हूं जो ग्राहक वर्ग से संबंधित है (ग्राहक एक कंपनी है)। तो ग्राहक के पास कई admin_users हैं।रेल 3 ActiveAdmin CanCan। सेटअप कैसे करें कि उपयोगकर्ता को केवल उस रिकॉर्ड को देखना चाहिए जो उसके हैं?

मैं किसी निश्चित ग्राहक से संबंधित शिपमेंट रिकॉर्ड तक पहुंच प्रतिबंधित करने की कोशिश कर रहा हूं। मैं नहीं चाहता कि ग्राहक अन्य ग्राहक डेटा देख रहे हों। तो मैं इस सेट अप, लेकिन यह :: क्षमता कुछ भी नहीं ...

वर्ग की क्षमता कैनकैन शामिल करने के लिए लगता है

def initialize(user) 
    user ||= AdminUser.new  
    if user.role == "administrator" 
     can :manage, :all 
    else 
     cannot :create, :all 
     cannot :update, :all 
     cannot :destroy, :all 
     can :read, Shipment do |shipment| 
     shipment.customer == user.customer 
     end 
    end 
    end 
end 

और मैं shipments.rb में इस की क्या ज़रूरत है ...

ActiveAdmin.register Shipment do 
    menu :if => proc{ can?(:read, Shipment) }, :priority => 1 
    controller.authorize_resource 

    index do 
    column "File #", :sortable => :file_number do |shipment| 
     link_to shipment.file_number, admin_shipment_path(shipment) 
    end 
    [... more columns ...] 
    default_actions if can? :manage, Shipment 
    end 

    show :title => :file_number do 
    panel "Shipment Details" do 
    attributes_table_for shipment do 
    row("File number") {shipment.file_number} 
    row("Mode") {shipment.mode} 
    row("Ocean Rate") { number_to_currency shipment.ocean_rate} 
    row("Customer") { link_to shipment.customer.company_name, admin_customer_path(shipment.customer)} 
    row("Shipper") { link_to shipment.shipper.company_name, admin_shipper_path(shipment.shipper)} 
    row("Broker") { link_to shipment.broker.company_name, admin_broker_path(shipment.broker)} 
    end 
end 

[...more show action stuff...] 

तो इंडेक्स पेज में, सभी शिपमेंट प्रदर्शित होते हैं और यदि मैं ग्राहक ए के रूप में लॉग इन हूं और ग्राहक बी के शिपमेंट पर क्लिक करता हूं तो मैं इसे देख सकता हूं, लेकिन यह मुझे अवरुद्ध करना है।

अधिक जानकारी ...

shipments_controller.rb 
class ShipmentsController < InheritedResources::Base 
    before_filter :authenticate_admin_user! 
end 

उत्तर

0

मैं क्यों यह काम नहीं कर रहा पता नहीं है, लेकिन can? :read, Shipmentcan :read, Shipment do |shipment| ... के लिए अनुमतियों को देखने नहीं होंगे।

इस अनुमति के विरुद्ध सत्यापन करने के लिए आपको शिपमेंट का एक विशिष्ट उदाहरण निर्दिष्ट करना होगा, जैसे can :read, @shipment

आपको menu :if => ... लाइन से पहले एक्सेस किए गए शिपमेंट का उदाहरण प्राप्त करने का कोई तरीका ढूंढना होगा।


आप केवल authorize_resource के बजाय controller.load_and_authorize_resource उपयोग करने का प्रयास किया?

+0

इस डॉक्स के अनुसार और काम नहीं करता है किसी भी उपयोगकर्ता किसी भी लदान 'देख सकते हैं क्योंकि या तो की कोशिश की कर सकते हैं: शिपमेंट, शिपमेंट,: customer_id => user.customer_id' https://github.com/ryanb/cancan/wiki/defining-abilities – leonel

+0

आपकी अनुमति परिभाषा ठीक है, यह आपका 'मेनू है: if => ...' ऐसी चीज जो काम नहीं कर रही है, हो सकता है कि आप हमें 'shipments.rb' फ़ाइल में इसका उपयोग करने के तरीके पर अधिक संदर्भ दे सकें (क्या आप वाकई' शिपमेंट_कंट्रोलर.आरबी' 'में नहीं हैं?)। – mbillard

+0

मैंने प्रश्न में और जानकारी जोड़ा। 'मेन्यू: आईडी =>' लाइन क्या है, अगर उपयोगकर्ता को इसका उपयोग करना चाहिए तो मेनू को छुपाएं या दिखाएं, मुझे नहीं लगता कि यह समस्या है। तो मुझे सूचीबद्ध सभी रिकॉर्ड्स मिलते हैं, अगर मैं उन रिकॉर्ड्स में से किसी एक पर क्लिक करता हूं जिसे उपयोगकर्ता नहीं देखना चाहता है, तो यह अभी भी प्रदर्शित हो जाता है और मुझे उम्मीद है कि कैनकन मुझे बताएगी कि एक्सेस अस्वीकृत है। – leonel

1

मुझे अपने ऐप में एक ही समस्या थी। मेरे पास super_users और व्यवस्थापक थे जहां व्यवस्थापक केवल अपने संगठन में अन्य व्यवस्थापक देख सकते थे।/

एप्लिकेशन/मॉडल ability.rb

if user.organization_admin? 
    can :manage, User, :organization_id => user.organization_id 
end 

एप्लिकेशन/व्यवस्थापक/users.rb

controller do load_and_authorize_resource :except => :index 
    def scoped_collection 
    end_of_association_chain.accessible_by(current_ability) 
    end 
end 
0

एक scoped संग्रह का उपयोग करें और एक प्रश्न है कि वर्तमान उपयोगकर्ता साइन इन पर निर्भर करता है चलाने

ActiveAdmin.register Shipment do 
    controller do 
    def scoped_collection 
     my_scope = resource_class.unscoped 
     return my_scope if current_admin_user.role == "administrator" # return everything 
     my_scope.where(customer_id: current_admin_user.customer_id) # filter by signed in user 
    end 
    end 
end 
संबंधित मुद्दे