Ruby on rails 使用带命名空间的Pundit
在我的项目中,我有一个非常常见的名称空间“admin” 我使用Pundit gem来设置适当的授权,但我发现很难在命名空间中使用控制器。我的政策安排如下Ruby on rails 使用带命名空间的Pundit,ruby-on-rails,pundit,Ruby On Rails,Pundit,在我的项目中,我有一个非常常见的名称空间“admin” 我使用Pundit gem来设置适当的授权,但我发现很难在命名空间中使用控制器。我的政策安排如下 -policies -admin user_policy.rb application_policy.rb admin_policy.rb awesome_policy.rb 非常类似于控制器 然而,当我在控制器中使用“authorize”方法时,我只得到一个错误,通知应用程序“找不到UserP
-policies
-admin
user_policy.rb
application_policy.rb
admin_policy.rb
awesome_policy.rb
非常类似于控制器
然而,当我在控制器中使用“authorize”方法时,我只得到一个错误,通知应用程序“找不到UserPolicy”。我的用户策略如下所示:
class Admin::UserPolicy < AdminPolicy
end
class Admin::UserPolicy
那么问题是什么,我应该怎么做才能让Pundit看到命名空间内的那些策略呢?简短回答:不能让Pundit使用特定于控制器命名空间的策略 详细回答:Pundit查看资源(模型)以确定要使用的策略类,因此,每当您将
User
模型的实例作为资源传入时,它都会查找UserPolicy
,而不是Admin::UserPolicy
看,还有
您可以在用户
模型上指定一个,但这并不能真正解决您的命名空间控制器问题,因为无论您在何处授权,Pundit都将从该模型派生策略类。使用新的合并,您可以这样做
它会自动工作
更新:
从0.3版本有效删除,无需更换功能。但是,可以在上的命名空间分支中获取命名空间功能
您可以在中看到功能的讨论
我的建议是,对于那些希望与权威人士一起使用名称空间的人,暂时不要使用。在筛选之前进行筛选,以访问限制区域,如管理仪表板,并将授权模型规则保留在权威文件中。这样,您就可以使用pundit,而不会出现任何问题。虽然onemanstartup提到现在应该可以自动运行,但我无法让名称空间策略正常运行,但以下是我认为可以接受的 在您的例子中,在AdminPolicy中,我添加了自定义操作名称,如
def new_user?
some code
end
然后在我的Admin::UserController#新操作中
def new
authorize @user, :new_user?
end
只是因为同样的问题才来这里。使用pundit v2.1.0,这可以通过覆盖控制器中的
策略范围
和授权
实现。我对类似设置所做的操作:
module Admin
class ModuleController < ModuleController
private
def policy_scope(scope)
super([:admin, scope])
end
def authorize(record, query = nil)
super([:admin, record], query)
end
end
end
模块管理
类ModuleController
然后,只需使用控制器中处理策略的常用方法,它将从Admin
命名空间中获取策略
自述文件中也介绍了这一点
如果您需要更多的上下文而不仅仅是当前用户和记录,将非常有用。出色的工作!修正了一个我一直被卡住的问题!干得好@dminor使用最新版本时,它不再工作。但是我用了一把叉子,它对我很有用。
module Admin
class ModuleController < ModuleController
private
def policy_scope(scope)
super([:admin, scope])
end
def authorize(record, query = nil)
super([:admin, record], query)
end
end
end