2012-01-20 13 views
6

Bir müşteri sınıfına ait olan admin_users'ı kuruyorum (Müşteri bir şirkettir). Müşteri, birçok admin_users'a sahip.Raylar 3 ActiveAdmin CanCan. Kullanıcı, yalnızca kendisine ait kayıtları nasıl ayarlamalı?

Belirli bir müşteriye ait olan Gönderi kayıtlarına erişimi kısıtlamaya çalışıyorum. Müşterilerin diğer müşterilere ait verileri izlemesini istemiyorum. Bu yüzden bunu ayarlamak ama :: Yetenek Cancan dahil hiçbir şey ...

sınıf yeteneği yapmak gibi görünüyor

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 

Ve shipments.rb içinde bu var ...

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...] 

Dizin sayfasında, tüm gönderiler görüntülenir ve Müşteri A olarak giriş yaptım ve Müşteri B yüklemesine tıklarsam onu ​​görebilirim, ancak engellemesi gerekiyordu.

diğer bilgiler ...

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

cevap

0

ben işe yaramıyor neden bilmiyorum, ama can? :read, Shipmentcan :read, Shipment do |shipment| ... izinlerini bakmak olmaz.

Bu izne karşı doğrulamak için, bu can :read, @shipment gibi bir Gönderinin belirli bir örneğini belirtmeniz gerekir.

menu :if => ... hattınızın çağrılmasından önce erişilen gönderinin örneğini almanın bir yolunu bulmanız gerekir.


Eğer controller.load_and_authorize_resource yerine sadece authorize_resource ait kullanmayı deneyin mü?

+0

bu dokümanlara göre ve herhangi bir kullanıcı herhangi bir sevkıyat 'görebilirsiniz ya çünkü çalışmıyor çalıştı can: show, Shipment,: customer_id => user.customer_id' https://github.com/ryanb/cancan/wiki/defining-abilities – leonel

+0

İzin tanımınız gayet iyi, 'menünüz: if => ...' çalışmayan bir şey, belki bize 'shipments.rb' dosyasında nasıl kullanıldığına dair daha fazla içerik verebilirdiniz ('shipments_controller.rb' içinde olmadığından emin misiniz?). – mbillard

+0

Soruya daha fazla bilgi ekledim. 'Menu: id => 'satırının ne yapması, kullanıcının menüye erişimi olması gerektiğinde gizlemek ya da göstermek, sorun olduğunu düşünmüyorum. Bu yüzden listelenen tüm kayıtları alıyorum, kullanıcının görmemesi gereken kayıtlardan birine tıklarsam, hala görüntüleniyor ve CanCan'ın Erişim Reddedildiğini söylemesini bekliyorum. – leonel

1

Uygulamamda da benzer bir sorun yaşadım. Yöneticilerin ve yöneticilerin sadece organizasyonlarındaki diğer yöneticileri görebileceği yöneticilerim vardı.

app/modeller/

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

uygulama/admin/users.rb

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

bir kapsamlı koleksiyonunu kullanın ve kullanıcıya imzalanan akım bağlı olan bir sorgu çalıştırmak

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