Войдите в учетную запись другого пользователя с помощью Devise + Active Admin + Switch User - PullRequest
9 голосов
/ 03 января 2012

Я пытаюсь реализовать switch_user gem в моем существующем приложении rails 3.0.9. В моем приложении две модели, они

  1. Пользователь - для моих учетных записей клиентов, и это has_one Аккаунт
  2. AdminUser - Это было создано ActiveAdmin

Я уже включил разработку аутентификации для Users, и ActiveAdmin также очень хорошо работает с AdminUser. Теперь из своего интерфейса Active Admin я бы хотел выбрать учетные записи и войти в них, как и владелец учетной записи. Переключение пользователей работает нормально, но проблема в том, что любой может просто войти в учетные записи пользователей, если они знают URL-адреса.

http://localhost:3000/switch_user?scope_identifier=user_1

Все, что мне нужно, это разрешить только AdminUser (т. Е. Если есть сеанс ActiveAdmin) для доступа к учетным записям пользователя.

Вот так выглядит мой /config/initializers/switch_user.rb

SwitchUser.setup do |config|
  config.controller_guard = lambda { |current_user, request| current_admin_user.nil?}
  config.redirect_path = lambda { |request, params| "/dashboard" }
end

Но я получаю эту ошибку

NameError in SwitchUserController#set_current_user

undefined local variable or method `current_admin_user' for main:Object

Можно ли в любом случае получить доступ к сеансу активного администратора?

Код для /config/initializers/active_admin.rb

ActiveAdmin.setup do |config|
  config.site_title = "MyAppName"
  config.authentication_method = :authenticate_admin_user!
  config.current_user_method = :current_admin_user
end

Кстати, в моем контроллере приложений я не создал никаких методов для authenticate_admin_user, current_admin_user активный администратор работает без них.

Ответы [ 2 ]

6 голосов
/ 17 октября 2014

Вам нужно изменить локальный config/initializers/switch_user.rb:

config.controller_guard = lambda { |current_user, request, original_user, controller|
    controller.admin_user_signed_in?
}

Оригинальная лямбда имеет 2 аргумента. Просто добавьте больше (до 4) и используйте его.

Не забудьте перезапустить сервер rails:)

2 голосов
/ 05 января 2012

ОК. Я думаю, что нашел решение для защиты switch_user.Все, что я сделал, это переместил маршруты в области действия admin_users

  ActiveAdmin.routes(self)

  devise_for :admin_users, ActiveAdmin::Devise.config do
    match '/admin/switch_user', :controller => 'switch_user', :action => 'set_current_user'
  end
...