Активная аутентификация администратора конфликтует с аутентификацией пользователя

#ruby-on-rails #devise #ruby-on-rails-3.1 #activeadmin #warden

#ruby-on-rails #разработать #ruby-on-rails-3.1 #activeadmin #надзиратель

Вопрос:

Active Admin — это драгоценный камень, используемый для создания панели администратора в вашем приложении. Он использует Devise для входа пользователей в систему и создает отдельную admin_user модель для администраторов. Мое приложение уже использует devise и использует своих пользователей в качестве user модели. С тех пор, как я начал использовать active admin gem, в моем файле routes следующая строка продолжает разрешаться в home #index, а не в users#dashboard, даже когда мой пользователь вошел в систему. Раньше это работало нормально, когда зарегистрированные пользователи попадали в users#dashboard в качестве корневого URL.

 root :to => 'users#dashboard', :constraints => lambda {|r| r.env["warden"].authenticate? }
root :to => 'home#index'
  

Происходит то, что .authenticate? проверяется, входит ли в систему admin_user (принадлежит активному администратору) или нет, но не моя user модель, что мне нужно проверить, поэтому, когда я вхожу в активный интерфейс администратора, корень моего сайта становится users #dashboard вместо этого, не проверяя, user вошел ли он в системуили нет. Как я могу сделать .authenticate? проверку на user вход в систему и нет admin_user ?

Любая помощь или подсказки будут очень признательны

Комментарии:

1. На самом деле кажется, что я получаю эту проблему из-за Active Admin и того факта, что он использует Devise. Вход в интерфейс активного администратора влияет на поведение таким образом, что приложение пытается перевести каждого пользователя на панель мониторинга, если активный администратор вошел в систему, и каждого пользователя в индекс home #, если активный администратор вышел из системы, независимо от того, вошел ли в систему сам обычный пользователь или нет

2. Любая помощь или подсказки будут очень признательны

3. раздел текущего пользователя в config/initializers/active_admin.rb

4. На самом деле это уже установлено config.current_user_method = :current_admin_user , что отличается от current_user используемого во всем приложении. Дело в том, что Devise использует Warden, и приведенная выше команда, которую я использую в файле маршрутов, зависит от Warden. Если бы была другая команда, которую я мог бы использовать, которая была более специфичной для того, какого пользователя использовать, это сделало бы это намного проще :/

5. перенаправление на корневой_путь, если warden.user.is_admin?

Ответ №1:

Я смог решить эту проблему. Проблема была связана с ожиданием разработки однопользовательской модели в приложении. Вот как это исправить.

В config/initializers/devise.rb файле добавьте:

 config.scoped_views = true
  

и

 config.default_scope = :user #or whichever is your regular default user model
  

вот и все, надзиратель проверяет:user для входа в систему, а не:admin_user

Ответ №2:

Почему вы используете get "/" ? Вы должны удалить его. Я использую определение, очень похожее на ваше, и оно отлично работает со мной. Используйте только:

 root :to => 'users#dashboard', :constraints => lambda {|r| r.env["warden"].authenticate? }
root :to => 'home#index'
  

Комментарии:

1. Я тоже пробовал это, но это все равно всегда приводит меня к home#index. Похоже lambda {|r| r.env["warden"].authenticate? } , что для меня всегда возвращается false, независимо от того, зарегистрирован пользователь или нет.

Ответ №3:

Я не уверен, но вы можете попробовать что-то вроде

 root :to => proc { |env| [ 302, {'Location'=> env["warden"].authenticate? ? "users/dashboard" : "/home" }, [] ] }
  

Комментарии:

1. Я пытался использовать root :to => proc { |env| [ 302, {'Location'=> env["warden"].authenticate? ? "users/dashboard" : "/home/index" }, [] ] } , но он всегда пытается перенаправить меня в /home/index независимо от того, вошел пользователь в систему или нет. Я подозреваю, что что-то не так с аутентификацией? команда, возможно, всегда приводит к false

2. Я не знаком с Warden, но вы можете глубоко изучить его исходный код для реализации authenticate? в вашем процессе. Или env["warden"] возвращает не то, что ожидалось.

Ответ №4:

Что сработало для меня, так это:

 constraint = lambda { |request| request.env["warden"].authenticate? and request.env['warden'].user.instance_of?(AdminUser) }