8

我在我的应用程序的管理部分使用权威人士进行访问控制。我有一个仪表板控制器,如下所示:

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

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

4

6 回答 6

12

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
于 2015-04-24T03:55:29.133 回答
4

我有这样的无头政策:

app/policies/admin/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 并执行“捆绑安装”。

于 2014-08-06T07:46:57.703 回答
3

通过使用以下方法,我设法在命名空间控制器操作上使用 Pundit,而不管模型如何:

在我的 /private/scrapers_controller.rb 我有

module Private
  class ScrapersController < Private::PrivateApplicationController

    # Pundit authorizations
    before_action { authorize [:private, :scrapers] }
    def index
    end
...

然后在 policy/private/scrapers_policy.rb

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

这将禁止任何非 :super_admin 用户访问 scrapers#index 或控制器内的任何其他操作

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

before_action { authorize [:private, :scrapers], :index? }
于 2016-10-21T10:03:25.427 回答
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
于 2014-08-14T18:03:26.717 回答
1

检查你的权威版本。您可能需要运行 'bundle update pundit',因为最近才合并到 master 无头策略,在此之前您需要从 github 安装 pundit:'elabs/pundit' 才能使用它们。

描述的问题

合并无头策略

于 2014-10-02T13:23:20.913 回答
0

例如,如果您只想为控制器仪表板#index 呈现登录页面,无需授权用户,您可以跳过授权,例如

仪表板控制器.rb

class DashboardController < ApplicationController  
  def index        
    skip_policy_scope
  end  
end

因此,您根本不必创建 DashboardPolicy。

于 2016-03-31T09:41:02.777 回答