2

我正在尝试在特定权限内提供一些自定义角色。在任何地方都找不到这个答案

角色能力.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

它按预期工作......我可以访问所有管理区域

我只希望“零售商”能够:管理产品!;)

“admin”只是一个与用户关联的角色,即所有角色都是用户。

您可能会看到它的发展方向,零售商可以注册并销售他们自己的商品......这就是目标。

任何指针?

4

2 回答 2

4

快速解决此问题的方法是将 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”要求。

这意味着该角色必须有权访问 Product 的 :admin 和 :action .. 即:

应用程序/模型/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)
于 2011-07-05T00:56:21.327 回答
2

spree_auth_devise 中有一种本地方式可以做到这一点。它没有记录在案,但现在是。

https://github.com/spree/spree_auth_devise 部分:“在现有的 Rails 应用程序中使用”

于 2014-03-25T14:07:02.243 回答