代码之家  ›  专栏  ›  技术社区  ›  Augusto Samamé Barrientos

cancancan authorize_资源未按预期工作

  •  5
  • Augusto Samamé Barrientos  · 技术社区  · 7 年前

    我得到了一个意想不到的行为,一个简单的坎坎坎授权。

    class Ability
      include CanCan::Ability
    
      def initialize(user)
        # Define abilities for the passed in user here. For example:
        #
        user ||= User.new # guest user (not logged in)
        if user.is_admin?
            can :manage, :all
        elsif user.is_standard?
            can :manage, ServiceOrder, {user_id: user.id}
            can :manage, ServiceOrderDetail, :service_order => { :user_id => user.id }
        end
    

    服务订单。rb控制器(部分显示)

    class ServiceOrdersController < ApplicationController
      authorize_resource
    
      def show
        @service_order = ServiceOrder.includes(:service_order_details).find(params[:id])
      end
    
    end
    

    这不起作用,因为它允许控制器显示任何service\u订单记录,而不仅仅是当前用户拥有的记录。

    authorize! :show, @service_order
    

    这样地:

      def show
        @service_order = ServiceOrder.includes(:service_order_details).find(params[:id])
        authorize! :show, @service_order
      end
    

    authorize_resource

    2 回复  |  直到 7 年前
        1
  •  10
  •   Michael Gorman    7 年前

    正在发生的是 authorize_resource @service_order 尚未设置,它正在对照类进行检查,并且用户确实有权显示 ServiceOrder 刚刚受到约束。

    添加authorize\u资源将安装调用authorize!的before\u操作回调!,传递资源实例变量(如果存在)。如果未设置实例变量(例如在索引操作中),它将传入类名。例如,如果我们有一个ProductsController,它将在每个操作之前执行此操作。

    批准(参数[:action].to_sym,@product | | product)

    from Cancancan documentations

    你需要做的是 load_and_authorize_resource before_filter 授权资源 呼叫

        2
  •  2
  •   widjajayd    7 年前

    我的建议是:不要使用authorize\u资源,而是使用load\u和authorize\u资源,下面是控制器的示例 只需确保您的strong\u参数声明:service\u order\u params

      load_and_authorize_resource param_method: :service_order_params