Rails 3 - L'administrateur actif peut-il utiliser un modèle d'utilisateur existant?

Peut Active Admin actuel Concevoir modèle d'utilisateur? Il a déjà une colonne nommée admin , et si c'est true , j'aimerais contourner le login administrateur actif, en allant à /admin .

est-ce possible?

lignes actuelles:

#Active admin
ActiveAdmin.routes(self)

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

Le reste est essentiellement standard Concevoir + Active admin

50
demandé sur Frexuz 2011-12-02 22:18:57

4 réponses

Oui, vous pouvez le faire, lorsque exécuter le générateur sauter 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!

uncement config.authentication_method et fournir 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 oeil à Active Admin Configuration

Espérons que cette aide.

69
répondu JCorcuera 2017-02-23 02:58:38

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

en outre, cependant, vous voudrez mettre à jour les paramètres suivants ainsi:

# 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 à mettre à jour ces (ou la méthode mentionnée dans le post), et juste il y a trop de méthodes ailleurs, mais cela semble être l'approche la plus facile / la plus propre. Vous devrez évidemment remplacer " user "dans chaque paramètre ( current_USER ) par le nom du modèle en utilisant l'authentification de devise.

je recommande également de mettre à jour le paramètre suivant pendant que vous êtes là:

# 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

ce dernier changement est requis si la méthode HTTP par défaut utilisée par votre la configuration de devise est définie à :delete , ce qu'elle est à moins que vous ne la changiez. Il est important 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 recevrez un message indiquant que la route [GET] /users/sign_out n'existe pas.

25
répondu jamesconant 2013-02-01 17:23:04

Tout ce que tout le monde l'a dit et en conjonction avec le guide mis à 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 l'information Si vous choisissez de revenir à l'option d'avoir un modèle utilisateur simple lorsque vous avez déjà implémenté un modèle admin_user (c'est-à-dire que maintenant vous avez un 'utilisateur' aussi bien qu'un 'admin_user' modèle.)

Les étapes supplémentaires inclus

supprimer devise_for :admin_users, ActiveAdmin::Devise.config des routes.RB copier le code de app/admin/admin_user.rb à app/admin/user.rb (n'utiliser que ce qui est requis) supprimer app/admin/admin_user.rb (ou vous obtiendrez un erreur constante non initialisée sur administrateur ) comme ce type avait (et moi aussi).

4
répondu Jay Killeen 2017-05-23 12:10:41

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

Roll Back admin_user migrations (si vous n'avez pas utilisé --skip-users lors de l'installation 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

puis supprimer ces 3 fichiers.

dans l'acheminement, supprimer la ligne devise_for :admin_users, ActiveAdmin::Devise.config

dans application_controller.rb, ajouter:

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 la sortie de devise via :get , ajouter dans la sortie de devise.rb:

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

créer is_admin migration:

rails g migration add_is_admin_to_user is_admin:boolean

modifier 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 dans les rails 4, n'oubliez pas pour ajouter is_admin dans permit_params. Dans app/admin/utilisateur.rb:

permit_params ....., :is_admin

ajouter des droits aux utilisateurs admin, dans une console:

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

Profiter

4
répondu Benjamin Crouzier 2014-12-08 15:16:35