权威无头政策

时间:2014-08-05 14:32:25

标签: ruby-on-rails ruby-on-rails-4 access-control pundit

我在app的admin部分使用pundit进行访问控制。我有一个仪表板控制器,如下所示:

class Admin::DashboardsController < AdminController
  def index
    @total_revenue = Order.total_revenue
    authorize :dashboards, :index?
  end

  ...

end

以及如下所示的政策:

class DashboardPolicy < Struct.new(:user, :dashboard)
  def index?
    true
  end
end

当我尝试访问/admin/dashboards/时,我收到Pundit::NotDefinedError, unable to find policy SymbolPolicy for dashboards

我也试过命名空间策略并得到了同样的错误。

6 个答案:

答案 0 :(得分:10)

jizak的回答对我不起作用,我找到了无头名称间隔政策的解决方案,诀窍是[:admin,:policy]第一个参数。

  class Admin::HomeController < AdminController
    def dashboard
      authorize [:admin, :home], :dashboard?
    end
  end

然后是政策:

Admin::HomePolicy < AdminPolicy
  def dashboard?
    return false unless user && user.admin?
    true
  end
end

答案 1 :(得分:4)

我有这样无头的政策:

应用程序/策略/管理/ statistic_policy.rb

class Admin::StatisticPolicy < Struct.new(:user, :statistic)

  def show?
    user.admin?
  end

end

应用程序/控制器/管理/ statistics_controller.rb

class Admin::StatisticsController < Admin::ApplicationController

  def show
    per_today Time.zone.now
    authorize :statistics, :show?
  end
  ...
end

它适用于我。

尝试更新gem,因为这些更改是新的(https://github.com/elabs/pundit/issues/77)。 从项目中删除您的Gemfile.lock并进行捆绑安装&#39;。

答案 2 :(得分:3)

我设法使用Pundit进行命名空间控制器操作,无论模型如何,都使用它:

在我的/private/scrapers_controller.rb中我有

class Private::ScrapersPolicy < ApplicationPolicy
  def index?
    return true if user.has_role?(:super_admin)
    return false
  end
end

然后在policies / private / scrapers_policy.rb

before_action { authorize [:private, :scrapers], :index? }

这将禁止访问刮刀#index或控制器内的任何其他操作给任何不是:super_admin的用户

要仅明确禁止索引,您可以使用:


              try{
                  }catch(Exception e){
                  }finally{
                      cursor.close();
                  }

答案 3 :(得分:2)

我最近遇到了同样的问题。我遇到的问题是控制器没有模型。

请记住,Pundit是基于模型的授权,而不是基于控制器的授权。

在创建Admin类之前(在模型中),我得到了与您相同的错误。另外,请记下控制器中仪表板操作的授权声明。

控制器/ admin_controller.rb

class AdminController < ApplicationController
  after_action :verify_authorized

  def dashboard
    authorize Admin, :dashboard?
  end
end

模型/ admin.rb

class Admin
  def self.policy_class
    AdminPolicy
  end
end

政策/ admin_policy

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

  def dashboard?
    user.admin?
  end

end

答案 4 :(得分:1)

检查你的专家版。您可能需要运行“捆绑更新专家”,因为无头策略最近已合并到主人,在此之前您需要从github安装专家:&#39; elabs / pundit&#39;使用它们。

Described issue

Merged headless policies

答案 5 :(得分:0)

如果您只想渲染控制台仪表板#index的登录页面,例如,无需授权用户,您可以跳过授权,如

<强> dashboard_controller.rb

class DashboardController < ApplicationController  
  def index        
    skip_policy_scope
  end  
end

因此您根本不必创建DashboardPolicy。