【问题标题】:Use pundit to deny users from admin views使用 pundit 从管理员视图中拒绝用户
【发布时间】:2017-04-13 08:06:35
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: ruby-on-rails pundit


    【解决方案1】:

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

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

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

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

    原因是像权威人士这样的授权系统通过引发在控制器中捕获的异常来呈现“错误”页面或重定向。未经授权的操作还应返回不同的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2016-12-17
      相关资源
      最近更新 更多