51 votes

Rails 3 - Active_admin peut-il utiliser un modèle d'utilisateur existant ?

Can Admin actif utiliser mon Concevoir modèle utilisateur ? Il possède déjà une colonne nommée admin et si c'est true j'aimerais contourner l'ouverture de session de l'administrateur actif, lorsque je me rends dans la section /admin .

Est-ce possible ?

Itinéraires actuels :

#Active admin
ActiveAdmin.routes(self)

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

Le reste est essentiellement de l'administration standard Devise + Active.

70voto

JCorcuera Points 3632

Oui, vous pouvez le faire, quand fonctionnement du générateur sauter la création du modèle d'utilisateur :

rails generate active_admin:install --skip-users

Alors dans votre 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!

Décommenter config.authentication_method et fournissez votre méthode d'authentification pour votre administrateur, par exemple :

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

Redémarrez votre serveur et il devrait fonctionner. Jetez également un coup d'oeil à Configuration de l'administration active

J'espère que cela vous aidera.

26voto

detectivist Points 392

Comme indiqué précédemment, vous devrez mettre à jour votre config/initializers/active_admin.rb pour refléter la méthode d'authentification correcte.

En outre, vous voudrez également mettre à jour les paramètres suivants :

# 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

et

# 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

Bien sûr, vous n'êtes pas obligé de mettre à jour ces paramètres (ou la méthode mentionnée dans le message), et vous pouvez simplement remplacer les méthodes utilisées ailleurs, mais cela semble être l'approche la plus simple et la plus propre. Vous devrez évidemment remplacer "user" dans chaque paramètre ( current_USER ) avec le nom du modèle utilisant l'authentification par devise.

Je vous recommande également de mettre à jour les paramètres suivants pendant que vous y êtes :

# 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

Cette dernière modification est nécessaire si la méthode HTTP par défaut utilisée par votre devise config est définie comme suit :delete ce qui est le cas, à moins que vous ne le changiez. Le fait qu'ils soient maintenant synchronisés est important, car si vous suivez ces instructions, vous utiliserez la fonction destroy_user_session_path qui est un chemin déjà défini par devise. Sinon, vous obtiendrez un message indiquant que la route [GET] /users/sign_out n'existe pas.

5voto

pinouchon Points 7706

Voici la procédure à suivre si vous avez déjà installé ActiveAdmin avec les paramètres par défaut, et que vous voulez authentifier les utilisateurs avec User.is_admin sur votre modèle existant, et supprimez la table admin_user :

Annulez les migrations des utilisateurs admins (si vous n'avez pas utilisé la fonction --skip-users lors de l'installation d'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

Ensuite, supprimez ces 3 fichiers.

Dans le routage, supprimez la ligne devise_for :admin_users, ActiveAdmin::Devise.config

Dans application_controller.rb, ajoutez :

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

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

Pour configurer l'appareil afin qu'il se déconnecte via :get , ajouter dans devise.rb :

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

Créer la migration is_admin :

rails g migration add_is_admin_to_user is_admin:boolean

Modifiez la migration comme suit :

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

Et migrer :

rake db:migrate

Si vous êtes dans rails 4, n'oubliez pas d'ajouter is_admin dans permit_params. Dans app/admin/user.rb :

permit_params ....., :is_admin

Ajouter des droits aux utilisateurs admins, dans une console :

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

Profitez de

4voto

Jay Killeen Points 148

Tout ce que les autres ont dit, ainsi que le guide présenté à l'adresse suivante http://dan.doezema.com/2012/02/how-to-implement-a-single-user-model-with-rails-activeadmin-and-devise/

qui ajoute quelques informations supplémentaires si vous choisissez de revenir à l'option d'avoir un modèle d'utilisateur unique alors que vous avez déjà mis en place un modèle admin_user (c'est-à-dire qu'actuellement vous avez un modèle 'user' ainsi qu'un modèle 'admin_user').

Les étapes supplémentaires comprenaient

supprimer devise_for :admin_users, ActiveAdmin::Devise.config à partir de routes.rb copier le code de app/admin/admin_user.rb à app/admin/user.rb (n'utilisez que ce qui est nécessaire) supprimer app/admin/admin_user.rb (ou vous obtiendrez un Erreur de constante non initialisée sur AdminUser ) comme ce type l'avait fait (et moi aussi).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X