【发布时间】:2016-01-07 20:35:10
【问题描述】:
我有一个现有的 Rails 应用程序,其中 Devise 对 User 模型进行身份验证,Pundit 针对将 Enrollment 模型链接到我的 Company 模型的 Enrollment 模型进行身份验证。 User 和 Company 都在公寓 gem 的公共模式中。我不怀疑公寓是问题的一部分,但我想我会提到它。
我使用 AdminUser 类添加了 Active Admin - 我想让我的管理员用户与应用程序用户分开。
如果我尝试访问 /admin 或 /admin/dashboard,我会得到:
Pundit::PolicyScopingNotPerformedError at /admin/users
Pundit::PolicyScopingNotPerformedError
如果我尝试使用 /admin/users 之类的模型,Pundit 似乎会忽略 active_admin 策略并转到主要应用程序策略。在我的情况下,应用程序会引发异常,因为它需要 Enrollment 与 AdminUser。
如果我禁用:
##/config/initializers/active_admin.rb
config.authorization_adapter = ActiveAdmin::PunditAdapter
##/controllers/application_controller
after_action :verify_authorized, except: [:landing, :dashboard], unless: :devise_controller?
after_action :verify_policy_scoped, only: [:index]
一切正常,但我在主应用程序中丢失了 Pundit 等。
这是我的代码的要点:
https://gist.github.com/jasper502/4b2f1b8b6f21a26c64a5
以下是可以在此问题上找到的相关帖子:
https://gorails.com/forum/using-pundit-with-activeadmin
How to get Active Admin to work with Pundit after login
我希望在这篇文章 (Can you disable Pundit with Devise and Active Admin?) 中将 Pundit 全部禁用,但如果能做到这一点就好了。
更新
我有解决办法,但我仍然不知道这是否应该开箱即用,而且我有一些奇怪的问题导致了这一切。更新了要点。
我最终使用了:
https://viget.com/extend/8-insanely-useful-activeadmin-customizations
还有一点:
Documentation for conditional before_action/before_filter
以及下面的一些答案。我强行插入一个过滤器以强制 AA 对 AA 内部的资源和集合调用授权。接下来是添加策略范围,但现在我的大脑太痛了。
我还必须添加另一个过滤器来绕过仪表板上的身份验证,因为它是无头的。到目前为止似乎有效。
更新 2
嗯……我觉得我说得太早了。这一切只有在我以常规 User 身份登录时才有效 - 如果我退出,一切都会再次崩溃。
【问题讨论】:
标签: ruby-on-rails devise activeadmin pundit