2012-01-20 20 views
6

Configuré usuarios_administradores que pertenecen a una clase de cliente (el cliente es una empresa). Entonces, el Cliente tiene muchos usuarios de administración.Rails 3 ActiveAdmin CanCan. ¿Cómo configurar ese Usuario solo debería ver los registros que le pertenecen?

Estoy tratando de restringir el acceso a los registros de envío que pertenecen a un determinado cliente. No quiero que los clientes miren los datos de otros clientes. Así que lo configuran, pero parece que no hacer nada ...

Capacidad clase incluyen CanCan :: Capacidad

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 

Y tengo esto en 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...] 

Por lo tanto, en la página de índice, se muestran todos los envíos y si estoy conectado como Cliente A y hago clic en el envío del Cliente B puedo verlo, pero se supone que debe bloquearme.

Más información ...

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

Respuesta

0

No sé por qué no está funcionando, pero no voy a mirar can? :read, Shipment los permisos para can :read, Shipment do |shipment| ....

Para validar frente a este permiso, debe especificar una instancia específica de un envío, como esta can :read, @shipment.

Deberá encontrar una forma de obtener la instancia del envío al que se accede antes de llamar a su línea menu :if => ....


¿Usted intentó utilizar controller.load_and_authorize_resource en lugar de solamente authorize_resource?

+0

probado este de acuerdo con los documentos y no funciona bien debido a que cualquier usuario puede ver cualquier envío ' can: show, Shipment,: customer_id => user.customer_id' https://github.com/ryanb/cancan/wiki/defining-abilities – leonel

+0

Su definición de permiso está bien, es su 'menú: if => ...' Lo que no funciona, tal vez nos podría dar más contexto sobre cómo se usa en el archivo 'shipment.rb' (¿está seguro de que no está en' shipment_controller.rb'?). – mbillard

+0

Agregué más información en la pregunta. Lo que hace la línea 'menu: id =>' es simplemente esconder o mostrar el menú si el usuario debería tener acceso a él, no creo que ese sea el problema. Así que obtengo todos los registros enumerados, si hago clic en uno de los registros que el usuario NO debe ver, aún se muestra y espero que CanCan me diga Acceso denegado. – leonel

1

Tuve un problema similar en mi aplicación. Tenía superusuarios y administradores donde los administradores solo podían ver a otros administradores en su organización.

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

Utilice una colección de ámbito y ejecuta una consulta que depende de la corriente firmado en el usuario

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 
Cuestiones relacionadas