Pundit AuthorizationNotPerformedError / PolicyScopingNotPerformedError

时间:2018-05-04 10:04:10

标签: ruby-on-rails ruby authorization pundit

我是Pundit宝石的新手,我坚持不懈。

我尝试显示包含多条记录的列表,但我总是收到错误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。

1 个答案:

答案 0 :(得分:1)

来自the README

  

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

的方法      

...

     

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

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

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

但是,在您的情况下,您目前所拥有的内容并不一定能保证一项政策 - 您所检查的是用户是否已登录!

如果您要求用户登录,但他们不是,则您的应用程序应回复401错误,而不是403。例如,您可以在控制器中执行此操作before_action :authorize。 (这取决于您如何实施授权 - 请参阅您正在使用的任何库的文档,例如devise)。