使用pundit从管理员视图中拒绝用户

时间:2017-04-13 08:06:35

标签: ruby-on-rails pundit

我有一个管理员视图,只允许管理员查看。我正在使用权威授权申请。

  
    

如何为每个管理控制器创建策略(并使用授权装饰每个控制器),如何拒绝所有用户,但管理员可以使用admin视图?如果有一个较短的解决方案。

  

由于

1 个答案:

答案 0 :(得分:3)

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

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

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

用于授权视图的块而不是整个动作。

这样做的原因是像权威这样的授权系统通过引发控制器中捕获的异常来实现&#34;错误&#34;从异常中抢救的页面(通常是登录视图)。未经授权的操作还应返回不同的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