【问题标题】:Rails Pundit Authorization not performed未执行 Rails Pundit 授权
【发布时间】:2016-10-25 20:51:42
【问题描述】:

我在调用此控制器的 show 方法的 GET 请求时收到“Pundit::PolicyScopingNotPerformedError”。任何帮助表示赞赏。

控制器:

class DashboardsController < ApplicationController
  before_action :authorize_dashboard_for_customer, only: :show
  after_action :verify_authorized, except: :index
  after_action :verify_policy_scoped, only: :show

  expose(:dashboards) {
    Customer.find(params[:customer_id]).dashboards
  }

  expose(:dashboard) {
    Dashboard.find(params[:id])
  }

  expose(:customer) {
    Customer.find(params[:customer_id])
  }

  def index
  end

  def show
  end



  private

  def authorize_dashboard_for_customer
    authorize dashboard, :show?
  end  
end

这是权威政策:

class DashboardPolicy < ApplicationPolicy

  def index?
    show?
  end

  def show?
    customer = user.try(:customer)
    return false if customer.blank?

    @record.customers.present? && @record.customers.include?(customer) || user.role == 'admin'
  end
end

我已经阅读了有关此的其他帖子,但仍然没有看到我在这里做错了什么。我仍然不清楚解决策略范围的作用,但在这种情况下,我可以从调试语句中看到它正在达到策略,所以我不确定问题是什么。

【问题讨论】:

    标签: ruby-on-rails-4 pundit


    【解决方案1】:

    在您的控制器中,您正在检查以确保使用 after_action :verify_policy_scoped, only: :show 调用策略范围,但您没有为您的操作中的范围调用任何内容。

    您可以使用Scopes 来限制基于登录用户权限的结果。例如,索引屏幕上的管理员用户可能会看到所有结果,但非管理员可能只能看到某些记录。 IMO 你不应该在节目中需要范围,所以你应该能够删除verify_policy_scoped

    【讨论】:

    • 谢谢 - 这对一些人有帮助。 @Scott - 你说 但你没有在你的行动中为范围调用任何东西 - 我会在策略方法或控制器方法中调用这个范围吗?
    • @andrew 您将范围类添加到您的策略类,然后从控制器调用它以检索记录。
    猜你喜欢
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多