Rails 3 - Может ли Active_admin использовать существующую модель пользователя? - PullRequest
51 голосов
/ 02 декабря 2011

Может Активный администратор использовать мою текущую Разработать модель пользователя? В нем уже есть столбец с именем admin, и если он равен true, я бы хотел обойти вход активного администратора при переходе на /admin.

Возможно ли это?

Текущие маршруты:

#Active admin
ActiveAdmin.routes(self)

#Devise
devise_for :admin_users, ActiveAdmin::Devise.config
devise_for :users, :path => "account"

Остальное в основном стандартное Devise + Active admin

Ответы [ 4 ]

70 голосов
/ 02 декабря 2011

Да, вы можете сделать это, когда запустит генератор пропустите создание пользовательской модели:

rails generate active_admin:install --skip-users

Тогда в вашем config/initializers/active_admin.rb:

# == User Authentication
#
# Active Admin will automatically call an authentication
# method in a before filter of all controller actions to
# ensure that there is a currently logged in admin user.
#
# This setting changes the method which Active Admin calls
# within the controller.
config.authentication_method = :authenticate_admin!

раскомментируйте config.authentication_method и укажите метод аутентификации для вашего администратора, например:

# app/controllers/application_controller.rb
def authenticate_admin!
 redirect_to new_user_session_path unless current_user.is_admin?
end

Перезагрузите сервер, и он должен работать.Также обратите внимание на Конфигурация активного администратора

Надеюсь, это поможет.

26 голосов
/ 01 февраля 2013

Как указывалось ранее, вам необходимо обновить config/initializers/active_admin.rb, чтобы отразить правильный метод аутентификации.

Кроме того, однако, вы также захотите обновить следующие настройки:

# This setting changes the method which Active Admin calls
# to return the currently logged in user.
config.current_user_method = :current_admin_user

до

config.current_user_method = :current_user

и

# This setting changes the path where the link points to. If it's
# a string, the strings is used as the path. If it's a Symbol, we
# will call the method to return the path.
#
# Default:
config.logout_link_path = :destroy_admin_user_session_path

до

config.logout_link_path = :destroy_user_session_path

Конечно, вы НЕ ДОЛЖНЫ обновлять их (или метод, упомянутый в посте), а просто игнорируете методы в других местах, но это кажется самым простым / чистым подходом. Очевидно, вам нужно будет заменить «user» в каждой настройке (current_USER) на имя модели с использованием аутентификации devise.

Я бы также порекомендовал обновить следующие настройки, пока вы там находитесь:

# This setting changes the http method used when rendering the
# link. For example :get, :delete, :put, etc..
#
# Default:
config.logout_link_method = :get

до

config.logout_link_method = :delete

Это последнее изменение требуется, если для HTTP-метода по умолчанию, используемого вашей конфигурацией devise, установлено значение :delete, если оно не было изменено. Важно, что теперь они синхронизируются, потому что если вы будете следовать этим инструкциям, вы будете использовать destroy_user_session_path, который уже определен в devise. В противном случае вы получите сообщение о том, что маршрут [GET] / users / sign_out не существует.

4 голосов
/ 08 декабря 2014

Вот процесс, если вы уже установили ActiveAdmin с настройками по умолчанию и хотите аутентифицировать пользователей с помощью поля User.is_admin в существующей модели и удалить таблицу admin_user:

Откат миграций admin_user (если вы не использовали --skip-users при установке Active Admin):

rake db:migrate:down VERSION=20141205110842 # create_active_admin_comments.rb
rake db:migrate:down VERSION=20141205110831 # add_devise_to_admin_users.rb
rake db:migrate:down VERSION=20141205110820 # devise_create_admin_users.rb

Затем удалите эти 3 файла.

В маршрутизации уберите строку devise_for :admin_users, ActiveAdmin::Devise.config

В application_controller.rb добавить:

def authenticate_admin!
  if current_user && current_user.is_admin
    # fine
  else
    redirect_to new_user_session_path
  end
end

In active_admin.rb:

config.authentication_method = :authenticate_admin!
config.current_user_method = :current_user
config.logout_link_path = :destroy_user_session_path
config.allow_comments = false
config.logout_link_method = :get # couldn't get active_admin to sign out via :delete. So I configure devise to sign out via :get.

Чтобы настроить devise для выхода через :get, добавьте devise.rb:

config.sign_out_via = :get
# And for every occurrence of destroy_user_session_path, remove the option method: delete.

Создать миграцию is_admin:

rails g migration add_is_admin_to_user is_admin:boolean

Отредактируйте миграцию следующим образом:

class AddIsAdminToUser < ActiveRecord::Migration
  def change
    add_column :users, :is_admin, :boolean, default: false
  end
end

и мигрировать:

rake db:migrate

Если в рельсах 4, не забудьте добавить is_admin в allow_params. В app / admin / user.rb:

permit_params ....., :is_admin

Добавление прав администратора пользователям в консоли:

u = User.find(42); u.is_admin = true; u.save

Наслаждайтесь

4 голосов
/ 27 марта 2014

Все то, что сказали все остальные, а также в сочетании с руководством, изложенным в http://dan.doezema.com/2012/02/how-to-implement-a-single-user-model-with-rails-activeadmin-and-devise/

, которое добавляет некоторые дополнительные биты к информации, если вы решите вернуться к опции иметьоднопользовательская модель, когда вы уже внедрили модель admin_user (т. е. прямо сейчас у вас есть модель 'user' и модель 'admin_user').

Дополнительные шаги включают

remove devise_for :admin_users, ActiveAdmin::Devise.config из router.rb скопируйте код из app/admin/admin_user.rb в app/admin/user.rb (используйте только то, что требуется) удалите app/admin/admin_user.rb (или вы получите Неинициализированную постоянную ошибку в AdminUser ), как у этого парня (я тоже).

...