Пользовательские разрешения ролей - PullRequest
2 голосов
/ 28 марта 2011

Я пытаюсь дать некоторые пользовательские роли в рамках определенных разрешений.Не могу найти этот ответ где-нибудь

role_ability.rb

class RoleAbility
 include CanCan::Ability

 def initialize(user)

 user || User.new # for guest

 if user.has_role? "admin"
   can :manage, :all
 elsif user.has_role? "retailer"
   can :manage, Product
 else
   can :read, :all
 end


 end
end

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

если я изменю

 elsif user.has_role? "retailer"
can :manage, Product

на

 elsif user.has_role? "retailer"
can :manage, :all

Это работает, как и ожидалось ... Я могу получить доступ ко всей области администратора

Я только хочу, чтобы «Ритейлер» мог: управлять Продуктами, хотя!;)

«Администратор» - это только роль, связанная с пользователем, т. Е. Все роли - «Пользователи».

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

любые указатели ??

Ответы [ 2 ]

4 голосов
/ 05 июля 2011

Быстрое решение этой проблемы - добавить метод authorize_admin в admin :: ProductsController decorator.rb

app / controllers / admin_products_controller_decorator.rb

Admin::ProductsController.class_eval do
    def authorize_admin
        authorize! :admin, Product
        authorize! params[:action].to_sym, Product
    end
end

ПРИМЕЧАНИЕ: Это переопределит набор, заданный в auth / app / controllers / admin_orders_controller_decorator.rb, удалив требование ": admin, Object" для этого контроллера.

Это означает рольбудет иметь доступ к обоим действиям: admin AND: для продукта .. т.е.:

app / models / retailer_ability.rb

class RetailerAbility
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    if user.has_role? "retailer"
      can :read, Product
      can :admin, Product
    end
  end
end

Должно позволять ритейлерам читать продукты в админке.

Также не забудьте добавить это в инициализатор:

config / initializers / spree.rb

Ability.register_ability(RetailerAbility)
2 голосов
/ 25 марта 2014

В spree_auth_devise есть собственный способ сделать это.Это не было документировано, но теперь есть.

https://github.com/spree/spree_auth_devise Раздел: «Использование в существующем приложении Rails»

...