2012-01-20 10 views
6

Configurazione di admin_users che appartiene a una classe cliente (il Cliente è una società). Quindi il cliente ha molti admin_users.Rails 3 ActiveAdmin CanCan. Come configurare che l'utente dovrebbe vedere solo i record che gli appartengono?

Sto tentando di limitare l'accesso ai record di spedizione che appartengono a un determinato cliente. Non voglio che i clienti guardino i dati di altri clienti. Così ho creato questo in su, ma sembra di non fare nulla ...

classe Capacità includono CanCan :: Capacità

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 

E io ho questo 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...] 

Quindi nella pagina dell'indice, tutte le spedizioni vengono visualizzate e se sono registrato come cliente A e clicco sulla spedizione del cliente B posso vederlo, ma dovrebbe bloccarmi.

Più info ...

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

risposta

0

Non so il motivo per cui non funziona, ma can? :read, Shipment non guarderò le autorizzazioni per can :read, Shipment do |shipment| ....

Per convalidare contro questa autorizzazione, è necessario specificare un'istanza specifica di una spedizione, ad esempio can :read, @shipment.

È necessario trovare un modo per ottenere l'istanza della spedizione raggiunta prima che venga chiamata la linea menu :if => ....


Hai provato utilizzando controller.load_and_authorize_resource anziché soltanto authorize_resource?

+0

Abbiamo provato questo in base ai documenti e non funziona o perché qualsiasi utente può vedere qualsiasi spedizione ' can: show, Shipment,: customer_id => user.customer_id' https://github.com/ryanb/cancan/wiki/defining-abilities – leonel

+0

La tua definizione di permesso va bene, è il tuo 'menu: if => ...' cosa che non funziona, forse potresti darci più contesto su come è usato nel file 'shipments.rb' (sei sicuro che non sia in' shipments_controller.rb'?). – mbillard

+0

Ho aggiunto più informazioni nella domanda. Ciò che la riga 'menu: id =>' fa è nascondere o mostrare il menu se l'utente deve accedervi, non penso che sia questo il problema. Quindi ottengo tutti i record elencati, se faccio clic su uno dei record che l'utente NON deve vedere, viene comunque visualizzato e mi aspetto che CanCan possa dirmi Access Negato. – leonel

1

Ho avuto un problema simile nella mia app. Avevo superutenti e amministratori in cui gli amministratori potevano vedere solo altri amministratori nella loro organizzazione.

app/modelli/ability.rb

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

app/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

utilizzare una raccolta ambito ed eseguire una query che dipende dalla corrente firmato a utente

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 
Problemi correlati