【问题标题】:Pundit AuthorizationNotPerformedError/PolicyScopingNotPerformedErrorPundit AuthorizationNotPerformedError/PolicyScopingNotPerformedError
【发布时间】:2018-05-04 10:04:09
【问题描述】:

我是 Pundit gem 的新手,但我遇到了一些问题。

我尝试显示包含多条记录的列表,但总是收到错误 AuthorizationNotPreformedError。

我做错了什么?

控制器:

def planning
  @plans = Order.all
  authorize @plans
end

政策:

def planning?
  user.present?
end

Planning.html.haml

%h1 test

当我添加这个时:after_action :verify_policy_scoped, :only => planning, if: verify_policy_scoped?

我收到 PolicyScopingNotPerformedError。

【问题讨论】:

    标签: ruby-on-rails ruby authorization pundit


    【解决方案1】:

    来自the README

    Pundit 会跟踪您是否在控制器操作中的任何位置调用了 authorize。 Pundit 还为您的控制器添加了一个名为 verify_authorized

    的方法

    ...

    Pundit 还将verify_policy_scoped 添加到您的控制器中。这将引发类似于verify_authorized 的异常。但是,它会跟踪是否使用了policy_scope 而不是authorize

    你把这两种方法混在一起了。您已经调用了authorize,但正在检查是否调用了policy_scope

    policy_scope 通常用于记录的集合(例如您的示例,或更常见的是index 操作),而authorize 通常用于个人 记录(如show/edit/update/destroy 操作)。

    但是,在您的情况下,您目前所拥有的内容并不一定完全符合政策 - 您要检查的只是用户是否已登录!

    如果您要求用户登录,但他们没有登录,那么您的应用程序应该响应 401 错误,而不是 403。例如,您可以在控制器中使用before_action :authorize 来执行此操作。 (这取决于您是如何实现授权的——请参阅有关您使用的任何库的文档,例如devise)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多