Разрешения для пользовательских ролей Spree

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

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

to

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

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

Я только хочу, чтобы "Розничный продавец" мог управлять товарами!! ;)

«admin» — это только роль, связанная с пользователем, т. е. все роли — Пользователи.

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

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


person Zarne Dravitzki    schedule 28.03.2011    source источник
comment
Кстати, у меня появляется сообщение «Ошибка авторизации», когда я пытаюсь выполнить вышеуказанные действия.   -  person Zarne Dravitzki    schedule 28.03.2011


Ответы (2)


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

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

person John Hirbour    schedule 25.03.2014
comment
Можете ли вы подтвердить, что это работает для ограничения/предоставления доступа к графическому интерфейсу администратора частей для пользователей без роли администратора? Похоже, что может, но не показывает этот случай в README. (это читается так, как будто вы можете использовать в нем представление... но это было бы уродливо и угрюмо не рекомендуется) - person complistic; 03.06.2014

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

приложение/контроллеры/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, так и к :action для Product.. т.е.:

приложение/модели/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

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

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

конфиг/инициализаторы/spree.rb

Ability.register_ability(RetailerAbility)
person complistic    schedule 05.07.2011
comment
Просто обновление, я отправил мастеру патч, который делает эту функциональность по умолчанию, поэтому вам больше не понадобится декоратор :) Способность работает так же, как описано здесь, поэтому, если вы использовали мой патч, он ничего не сломает.. просто декоратор больше не нужен. - person complistic; 07.09.2011
comment
можешь дать ссылку на этот патч? - person Dominik Goltermann; 06.11.2012
comment
Извините за поздний ответ, вот ссылка на мой старый запрос на включение. github.com/spree/spree/pull/513 Понятия не имею, работает ли функциональность все еще в ядре или нет. - person complistic; 11.12.2012
comment
Это было решение, которое я использовал до Spree V1... может быть, Spree 0.6.2 и выше? Спасибо. Лучше всего следовать нативным стратегиям в более поздних версиях, как предлагается ниже. - person Zarne Dravitzki; 03.06.2014