У меня есть существующие приложения Rails с Devise
аутентичностью User
модели и Pundit
Идентификации по Enrollment
с моделью, которая связывает User
моей Company
модели. Оба User
и Company
находятся в открытой схеме квартиры. Я не подозреваю, что квартира является частью проблемы, но я подумал, что я бы сказал об этом.Активного Admin, Разрабатывают и Пандит (Пандит :: PolicyScopingNotPerformedError)
Я добавил Active Admin с классом AdminUser - я хочу, чтобы пользователь моего администратора был отдельно от пользователей приложения.
Если я пытаюсь получить доступ к /admin
или /admin/dashboard
я получаю:
Pundit::PolicyScopingNotPerformedError at /admin/users
Pundit::PolicyScopingNotPerformedError
Если бы я попробовать свои модели, как /admin/users
кажется Пандит игнорировать политику 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
Я искал для отключения Pundit все вместе в этом сообщении (Can you disable Pundit with Devise and Active Admin?) b Было бы неплохо просто сделать эту работу.
UPDATE
У меня есть работа вокруг, но я до сих пор не знаю, если это должно работать из коробки и у меня есть некоторые странные проблемы, вызывая все это. Обновлен Gist.
Я закончил с использованием:
https://viget.com/extend/8-insanely-useful-activeadmin-customizations
и немного:
Documentation for conditional before_action/before_filter
и немного ответа ниже. Я зачеркнул фильтр, чтобы заставить АА вызвать авторизацию на ресурсы и коллекции внутри АА. Далее следует добавить области политики, но мой мозг слишком сильно болит.
Мне также пришлось добавить еще один фильтр, чтобы обходить аутентификацию на панели мониторинга, поскольку она безголовая. Кажется, работает до сих пор.
UPDATE 2
Хммм ... Я думаю, что я говорил слишком рано.Это все работает только в том случае, если я вошел в систему как обычный User
. - Если я выйду из системы, все это снова развалится.
Спасибо за это. Вместо вашего первого 'before_filter' в admin/{resource} .rb вы можете изменить ApplicationController:' after_action: verify_policy_scoped, only:: index, если:: devise_or_pundit_controller? '...' def devise_or_pundit_controller? devise_controller? || self.class.name.match (/^Admin /) end' – Jay
Ницца, который чище! –