Аутентификация Active Admin, конфликтующая с аутентификацией пользователя
Active Admin - это драгоценный камень, используемый для панели управления администратора в вашем приложении. Он использует Devise для входа в систему пользователей и создает отдельную модель admin_user
для администраторов. Мое приложение уже использует devise и имеет своих пользователей в качестве модели user
. С тех пор, как я начал использовать активный админский жемчуг, в моем файле маршрутов следующая строка продолжает разрешать поиск на домашнем # индексе, а не на панели пользователей #, даже когда мой пользователь вошел в систему. Раньше это работало нормально, когда пользователи вносили пользователей #dashboard как корневой URL.
root :to => 'users#dashboard', :constraints => lambda {|r| r.env["warden"].authenticate? }
root :to => 'home#index'
Случается, что .authenticate?
проверяет, что admin_user
(принадлежащий Active Admin) входит в систему или нет, но не моя модель user
, которую я должен проверить, поэтому, когда я вошедший в активный интерфейс администратора, мой корневой сайт сайта становится пользовательской панелью пользователей вместо этого, не проверяя, зарегистрирован ли user
или нет. Как я могу сделать проверку .authenticate?
для входа user
, а не admin_user
?
Любая помощь или подсказки будут очень оценены
Ответы
Ответ 1
Я смог решить это. Эта проблема была связана с Devise, ожидающим использования одной пользовательской модели в приложении. Вот как это исправить.
В файле config/initializers/devise.rb
добавьте:
config.scoped_views = true
и
config.default_scope = :user #or whichever is your regular default user model
thats it, смотритель проверяет: user для входа в систему, а не: admin_user
Ответ 2
Почему вы используете get "/"
? Вы должны удалить его. Я использую определение, очень похожее на ваше, и отлично работает со мной. Используйте только:
root :to => 'users#dashboard', :constraints => lambda {|r| r.env["warden"].authenticate? }
root :to => 'home#index'
Ответ 3
Я не уверен, но вы можете попробовать что-то вроде
root :to => proc { |env| [ 302, {'Location'=> env["warden"].authenticate? ? "users/dashboard" : "/home" }, [] ] }
Ответ 4
Что для меня работало:
constraint = lambda { |request| request.env["warden"].authenticate? and request.env['warden'].user.instance_of?(AdminUser) }