使用 pundit 拒绝用户访问管理员视图

Use pundit to deny users from admin views

我有一个管理员视图,只有管理员可以查看。我正在使用 pundit 授权应用程序。

如何在不为每个管理控制器创建策略(并使用 authorize 装饰每个控制器)的情况下拒绝除管理员以外的所有用户访问管理视图?如果有更短的解决方案。

谢谢

您试图做的事情违反了 MVC 的本质,是一个非常糟糕的主意。

虽然您可以在视图中授权:

# In views
<% if policy(:dashboard).show? %>
  <%= link_to 'Dashboard', dashboard_path %>
<% end %>

那是为了授权视图​​块而不是整个操作。

原因是授权系统(如专家)通过引发异常来工作,该异常在控制器中捕获以呈现 "error" 页面或重定向。未经授权的操作还应该 return 不同的 HTTP 响应代码。在视图已经开始呈现时执行此操作会延迟响应周期,并且会导致双重呈现错误,因为服务器可能已经开始发送响应。

相反,您可以创建无头策略:

class AdminPolicy < Struct.new(:user, :admin)
  def admin?
    user.admin?
  end 
end 

你可以这样使用它:

# app/controllers/concerns/administrated.rb
module Administrated
  extends ActiveSupport::Concern

  included do
    before_action :authorize_admin
  end

  def authorize_admin
    authorize(:admin, :admin?)
  end
end

class ThingsController < ApplicationController
  include Administrated
end