web-dev-qa-db-fra.com

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

Admin actif peut-il utiliser mon modèle d'utilisateur Devise actuel? Il a déjà une colonne nommée admin, et si c'est true, je voudrais contourner la connexion d'administration active, lorsque vous allez à /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 fondamentalement standard Devise + Active admin

52
Frexuz

Oui, vous pouvez le faire lorsque en exécutant le générateur ignorez la création du modèle utilisateur:

Rails generate active_admin:install --skip-users

Puis 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 à 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 cela devrait fonctionner. Jetez également un œil à Configuration Admin Active

J'espère que cela t'aides.

70
JCorcuera

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

En outre, cependant, vous souhaiterez é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'avez pas à les mettre à jour (ou à la méthode mentionnée dans le post), et à contourner les méthodes ailleurs, mais cela semble être l'approche la plus simple/la plus propre. Vous devrez évidemment remplacer "utilisateur" dans chaque paramètre (current_USER) avec le nom du modèle utilisant l'authentification de devise.

Je recommanderais également de mettre à jour le paramètre suivant 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 requise si la méthode HTTP par défaut utilisée par votre configuration de devise est définie sur :delete, ce qu'il est, sauf si vous l'avez modifié. Il importe qu'ils soient maintenant synchronisés car si vous suivez ces instructions, vous utiliserez 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.

26
jamesconant

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

Restaurer les migrations admin_user (si vous n'avez pas utilisé --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

Supprimez ensuite 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 devise pour vous déconnecter via :get, ajoutez dans devise.rb:

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

Créer une 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 migrez:

rake db:migrate

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

permit_params ....., :is_admin

Ajoutez des droits aux utilisateurs administrateurs, dans une console:

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

Prendre plaisir

4
Benjamin Crouzier

Tout ce que tout le monde a dit ainsi que conjointement avec le guide présenté à http://dan.doezema.com/2012/02/how-to-implement-a-single-user-model- with-Rails-activeadmin-and-devise /

qui ajoute quelques bits supplémentaires sur les informations si vous choisissez de revenir à l'option d'avoir un modèle utilisateur unique lorsque vous avez déjà implémenté un modèle admin_user (c'est-à-dire que vous avez actuellement un modèle "utilisateur" ainsi qu'un modèle "administrateur_utilisateur") .

Les étapes supplémentaires incluses

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

4
Jay Killeen