我在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
我也试过命名空间策略并得到了同样的错误。
答案 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类之前(在模型中),我得到了与您相同的错误。另外,请记下控制器中仪表板操作的授权声明。
class AdminController < ApplicationController
after_action :verify_authorized
def dashboard
authorize Admin, :dashboard?
end
end
class Admin
def self.policy_class
AdminPolicy
end
end
class AdminPolicy < Struct.new(:user, :admin)
def dashboard?
user.admin?
end
end
答案 4 :(得分:1)
检查你的专家版。您可能需要运行“捆绑更新专家”,因为无头策略最近已合并到主人,在此之前您需要从github安装专家:&#39; elabs / pundit&#39;使用它们。
答案 5 :(得分:0)
如果您只想渲染控制台仪表板#index的登录页面,例如,无需授权用户,您可以跳过授权,如
<强> dashboard_controller.rb 强>
class DashboardController < ApplicationController
def index
skip_policy_scope
end
end
因此您根本不必创建DashboardPolicy。