2011-12-02 9 views

Respuesta

65

Sí se puede hacer eso, cuando running the generator omitir la creación del modelo de usuario:

rails generate active_admin:install --skip-users 

Luego, en su 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 y proporcionar su método de autenticación para su administración, por ejemplo:

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

Reinicie el servidor y se debe trabajar. También echa un vistazo a Active Admin Configuration

Espero que esto ayude.

+8

donde es exactamente lo que coloca el authenticate_admin! ¿método? He intentado con el controlador de la aplicación pero obtengo: método indefinido 'authenticate_admin_user! ' para #

+1

Lo ubicaría en el archivo config/initializers/active_admin.rb. – jackyalcine

+0

O en el controlador de la aplicación. – domachine

24

Como se indicó anteriormente, deberá actualizar su config/initializers/active_admin.rb para reflejar el método de autenticación correcto.

Además, sin embargo, tendrá que actualizar los ajustes siguientes, así:

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

a

config.current_user_method = :current_user 

y

# 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 

a

config.logout_link_path = :destroy_user_session_path 

Por supuesto, no TIENE que actualizar estos (o el método mencionado en la publicación), y simplemente anular los métodos en otros lugares, pero este parece ser el enfoque más fácil/más limpio. Obviamente tendrá que sustituir "usuario" en cada configuración (current_USER) con el nombre del modelo utilizando la autenticación de diseño.

Yo también lo recomendaría actualizar la configuración siguiente, así mientras estás allí:

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

a

config.logout_link_method = :delete 

Se requiere este último cambio, si el método HTTP predeterminado de la configuración legado se establece en :delete, que es a menos que lo haya cambiado. Es importante que ahora estén sincronizados porque si sigues estas instrucciones, estarás usando destroy_user_session_path, que es una ruta ya definida por el dispositivo. De lo contrario, recibirá un mensaje que indica que la ruta [GET]/users/sign_out no existe.

+0

Si no actualiza current_user_method con current_user, probablemente verá un flash con "Comment was not saved, text was empty." en la creación de comentarios de ActiveAdmin, hasta donde [la implementación actual proporciona solo error de texto vacío en caso de error] (https://github.com/activeadmin/activeadmin/blob/50d9893ea60993ef72047f072e5a4bc0c4d24b45/lib/active_admin/orm/active_record/comments.rb# L59). – rakvium

4

Todo lo que todo el mundo ha dicho, así como en conjunción con la guía establecidos en http://dan.doezema.com/2012/02/how-to-implement-a-single-user-model-with-rails-activeadmin-and-devise/

que añade algunos bits adicionales de información si usted está eligiendo para volver a la opción de tener un único usuario modelo cuando ya ha implementado un modelo admin_user (es decir, ahora mismo tiene un modelo de 'usuario' así como un modelo 'admin_user').

Los pasos adicionales incluyen

eliminar devise_for :admin_users, ActiveAdmin::Devise.config de routes.rb código copia de app/admin/admin_user.rb a app/admin/user.rb (sólo usar lo que se requiere) eliminar app/admin/admin_user.rb (o se obtendrá un Uninitialized constant error on AdminUser) como si este tipo tenía (y me también).

3

Aquí está el proceso si ya ha instalado ActiveAdmin con la configuración predeterminada, y que desea autenticar a los usuarios con User.is_admin campo en el modelo existente, y quitar admin_user tabla:

migraciones admin_user rollback (si no se ha utilizado --skip-users al instalar administración activa):

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 

Luego quitar esos 3 archivos.

En el enrutamiento, quitar la línea devise_for :admin_users, ActiveAdmin::Devise.config

En application_controller.rb, añadir:

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

En 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. 

Para configurar legado para cerrar la sesión a través de :get, agregar en devise.rb:

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

Crear is_admin la migración:

rails g migration add_is_admin_to_user is_admin:boolean 

Editar la migración de esta manera:

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

y migrar:

rake db:migrate 

Si en los carriles 4, no se olvide de añadir en is_admin permit_params. En aplicación/admin/user.rb:

permit_params ....., :is_admin 

Añadir derechos a los usuarios admin, en una consola:

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

Disfrute

Cuestiones relacionadas