Rails 3 - Can Active_admin utiliser un modèle utilisateur existant?
-
27-10-2019 - |
Question
Can Admin Actif utiliser mon courant Devise modèle utilisateur? Il a déjà une colonne nommée admin
, et si elle est true
, je voudrais contourner la connexion d'administration active, en allant à /admin
.
Est-ce possible?
Les 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 norme + administration active Devise
La solution
Oui, vous pouvez le faire, quand l'exécution du générateur sauter la création d'un modèle 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!
uncomment config.authentication_method
et fournir votre méthode d'authentification pour votre admin, 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. Aussi Jetez un oeil à Active Configuration Administrateur
Hope this helps.
Autres conseils
Comme indiqué précédemment, vous devez mettre à jour votre config/initializers/active_admin.rb
pour refléter la méthode d'authentification correcte.
De plus, cependant, vous souhaitez 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 à les mettre à jour (ou la méthode mentionnée dans le poste), et un peu plus-RIDE les méthodes ailleurs, mais cela semble être le plus facile / propre approche. Vous aurez évidemment besoin dans chaque paramètre pour remplacer « utilisateur » (de current_USER
) avec le nom du modèle en utilisant l'authentification DEVISE.
Je recommande également la mise à jour les paramètres suivants et pendant que vous êtes là-bas:
# 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 nécessaire si la méthode HTTP par défaut utilisé par votre config DEVISE est réglé sur :delete
, dont il est à moins que vous changiez. Il importe qu'ils sont maintenant synchronisés parce que si vous suivez ces instructions, vous utiliserez destroy_user_session_path
qui est un chemin déjà défini par legs. Sinon, vous obtiendrez un message indiquant que [GET] / utilisateurs / route sign_out n'existe pas.
Tout ce que tout le monde a dit, ainsi que conjointement avec le guide disposé à 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 unique d'utilisateur lorsque vous avez déjà mis en œuvre un modèle de admin_user (c.-à-moment vous avez un « utilisateur » ainsi qu'un « admin_user «modèle).
Les étapes supplémentaires inclus
supprimer devise_for :admin_users, ActiveAdmin::Devise.config
de routes.rb
copier le code de app/admin/admin_user.rb
à app/admin/user.rb
(utiliser uniquement ce qui est nécessaire)
suppression app/admin/admin_user.rb
(ou vous obtiendrez un Uninitialized erreur constante sur AdminUser) comme ce gars-là avait (et moi aussi).
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 champ User.is_admin
sur votre modèle existant et supprimer admin_user tableau:
Rollback migrations admin_user (si vous n'avez pas utilisé --skip-users
lors de l'installation d'administration active):
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
Retirez ensuite les 3 fichiers.
routage, retirer la devise_for :admin_users, ActiveAdmin::Devise.config
de ligne
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
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.
Concevoir de configurer pour vous déconnecter via :get
, ajoutez 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
Modifier la migration comme ceci:
class AddIsAdminToUser < ActiveRecord::Migration
def change
add_column :users, :is_admin, :boolean, default: false
end
end
Et Migrate:
rake db:migrate
Si dans des rails 4, ne pas oublier d'ajouter is_admin dans permit_params. Dans app / admin / user.rb:
permit_params ....., :is_admin
Ajouter des droits aux utilisateurs admin, dans une console:
u = User.find(42); u.is_admin = true; u.save
Profitez