我有一个管理员视图,只有管理员可以查看。我正在使用专家来授权应用程序。
如何在不为每个管理控制器创建策略(并使用 authorize 装饰每个控制器)的情况下拒绝除 admin 之外的所有用户访问管理视图?如果有更短的解决方案。
谢谢
您尝试做的事情违反了 MVC 的性质,是一个非常糟糕的主意。
虽然您可以在视图中授权:
# In views
<% if policy(:dashboard).show? %>
<%= link_to 'Dashboard', dashboard_path %>
<% end %>
那是为了授权视图的块而不是整个操作。
这样做的原因是像 Pundit 这样的授权系统通过引发异常来工作,该异常在控制器中被捕获以呈现“错误”页面或重定向。未经授权的操作还应返回不同的 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句