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