Rails 3 - Может ли Active_admin использовать существующую модель пользователя?
Может ли Active Admin использовать мою текущую модель Devise? У него уже есть столбец с именем admin
, и если он true
, я бы обошел логин Active admin при переходе на /admin
.
Возможно ли это?
Текущие маршруты:
#Active admin
ActiveAdmin.routes(self)
#Devise
devise_for :admin_users, ActiveAdmin::Devise.config
devise_for :users, :path => "account"
Остальное в основном стандартное Devise + Active admin
Ответы
Ответ 1
Да, вы можете это сделать, когда запускает генератор, пропустите создание модели пользователя:
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!
uncomment config.authentication_method
и укажите свой метод проверки подлинности для своего администратора, например:
# app/controllers/application_controller.rb
def authenticate_admin!
redirect_to new_user_session_path unless current_user.is_admin?
end
Перезагрузите сервер и он должен работать. Также посмотрите Active Admin Configuration
Надеюсь, что это поможет.
Ответ 2
Как уже говорилось ранее, вам нужно будет обновить ваш config/initializers/active_admin.rb
, чтобы отобразить правильный метод auth.
Кроме того, вы также захотите обновить следующие настройки:
# 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 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
) на имя модели с помощью специальной проверки подлинности.
Я также рекомендовал бы обновить следующую настройку, пока вы там:
# 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-метода по умолчанию, используемого конфигурацией вашего устройства, установлено значение :delete
, которое оно есть, если вы не изменили его. Важно, что теперь они синхронизируются, потому что, если вы будете следовать этим инструкциям, вы будете использовать destroy_user_session_path
, который является путем, уже определенным при разработке. В противном случае вы получите сообщение о том, что маршрут [GET]/users/sign_out не существует.
Ответ 3
Все, что говорили все остальные, а также в связи с руководством, изложенным в
http://dan.doezema.com/2012/02/how-to-implement-a-single-user-model-with-rails-activeadmin-and-devise/
который добавляет некоторые дополнительные биты в информацию, если вы решили вернуться к опции, чтобы иметь одну модель пользователя, когда вы уже внедрили модель admin_user (то есть прямо сейчас у вас есть "пользователь", а также "admin_user" ').
Дополнительные шаги включены
удалите devise_for :admin_users, ActiveAdmin::Devise.config
с маршрутов .rb
скопируйте код от app/admin/admin_user.rb
до app/admin/user.rb
(используйте только то, что требуется)
delete app/admin/admin_user.rb
(или вы получите Неинициализированную постоянную ошибку в AdminUser), как этот парень (и меня тоже).
Ответ 4
Здесь процесс, если вы уже установили 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
В 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.
Чтобы настроить устройство для выхода через :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. В приложении /admin/user.rb:
permit_params ....., :is_admin
Добавить права администратора пользователям в консоли:
u = User.find(42); u.is_admin = true; u.save
Enjoy