Rails 3 ActiveAdmin CanCan.Как настроить, что пользователь должен видеть только записи, которые ему принадлежат? - PullRequest
6 голосов
/ 20 января 2012

Я устанавливаю admin_users, который принадлежит к классу клиентов (Клиент - это компания). Таким образом, у Клиента есть много admin_users.

Я пытаюсь ограничить доступ к записям об отправке, принадлежащим определенному клиенту. Я не хочу, чтобы клиенты смотрели данные других клиентов. Так что я настроил это, но, похоже, ничего не делает ...

класс Способности включить CanCan :: Ability

  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

Ответы [ 4 ]

2 голосов
/ 30 апреля 2012

Active Admin имеет встроенный метод для обработки областей. Смотрите здесь: http://activeadmin.info/docs/2-resource-customization.html#scoping_the_queries

1 голос
/ 03 апреля 2012

У меня была похожая проблема в моем приложении.У меня были super_users и администраторы, где администраторы могли видеть только других администраторов в своей организации.

app / models / able.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 голосов
/ 15 июля 2013

Используйте коллекцию с определенными областями и выполните запрос, который зависит от текущего пользователя, вошедшего в систему

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
0 голосов
/ 20 января 2012

Я не знаю, почему это не работает, но can? :read, Shipment не будет искать разрешения для can :read, Shipment do |shipment| ....

Чтобы проверить это разрешение, вам нужно будет указать конкретный экземпляр Отправления.вот так can :read, @shipment.

Вам нужно будет найти способ получить экземпляр полученной посылки до вызова вашей линии menu :if => ....


Пробовали ли выиспользуя controller.load_and_authorize_resource вместо только authorize_resource?

...