2010-10-01 8 views
38

J'ai déjà mis en œuvre Authlogic pour autorisation sur mon site. Maintenant, cependant, je souhaite passer à l'utilisation de Devise à la place, et je me demande si quelqu'un a une expérience avec cela. Peut-être que quelqu'un a vu un billet de blog sur le sujet?Migration d'Authlogic vers Devise

Merci.

+0

Documentation complète pour migrer de authlogic à concevoir. https://sunilsharma3639.wordpress.com/2014/06/11/rails-authentication-authlogic-to-devise/ – sunil

Répondre

48

J'ai moi-même passé d'Authlogic à Devise récemment et je n'ai trouvé aucun article. Cependant, dans le cas le plus simple, une fois que vous avez supprimé tous vos fichiers user_session et autres codes liés à authlogic, le travail principal consiste à convertir votre ancienne table d'utilisateurs au format attendu par l'outil.

Ma vieille table ressemblait à ceci:

 Column  |   Type   |      Modifiers      
-------------------+--------------------------+---------------------------------------------------- 
id    | integer     | not null default nextval('users_id_seq'::regclass) 
login    | character varying(256) | not null 
password   | character varying(64) | not null 
created_at  | timestamp with time zone | not null 
updated_at  | timestamp with time zone | not null 
persistence_token | character varying(255) | not null 
Indexes: 
    "users_pkey" PRIMARY KEY, btree (id) 
    "index_users_on_persistence_token" UNIQUE, btree (persistence_token) 
    "users_login_key" UNIQUE, btree (login) 

et je déterminé que le tableau devrait contenir au moins les informations suivantes pour concevoir (avec de nombreuses fonctionnalités en option est activée):

id     | integer      | not null default nextval('contributors_id_seq'::regclass) 
email    | character varying(255)  | not null default ''::character varying 
encrypted_password | character varying(128)  | not null default ''::character varying 
password_salt  | character varying(255)  | not null default ''::character varying 
confirmation_token | character varying(255)  | 
confirmed_at   | timestamp without time zone | 
confirmation_sent_at | timestamp without time zone | 
reset_password_token | character varying(255)  | 
remember_token  | character varying(255)  | 
remember_created_at | timestamp without time zone | 
sign_in_count  | integer      | default 0 
current_sign_in_at | timestamp without time zone | 
last_sign_in_at  | timestamp without time zone | 
current_sign_in_ip | character varying(255)  | 
last_sign_in_ip  | character varying(255)  | 
failed_attempts  | integer      | default 0 
unlock_token   | character varying(255)  | 
locked_at   | timestamp without time zone | 
created_at   | timestamp without time zone | 
updated_at   | timestamp without time zone | 

J'ai donc défini une classe activeecord active dans la classe de migration

class ConversionUser < ActiveRecord::Base 
    set_table_name "users" 
end 

et la n est ici le code de migration « vers le haut » je me suis retrouvé à l'aide (avec PostgreSQL):

add_column :users, :email, :string, :limit => 255 
execute "UPDATE users SET email = login || '@somedomain.net'" 
execute "ALTER TABLE users ALTER email SET NOT NULL" 

add_column :users, :encrypted_password, :string, :limit => 128 
add_column :users, :password_salt, :string, :limit => 255 

require 'devise/encryptors/bcrypt' 
ConversionUser.find(:all).each do |u| 
    password_salt = Devise::Encryptors::Bcrypt.salt(Devise.stretches) 
    u.update_attributes!(:password_salt => password_salt, 
         :encrypted_password => Devise::Encryptors::Bcrypt.digest(u.password, Devise.stretches, password_salt, Devise.pepper)) 
end 

add_column :users, :confirmation_token, :string, :limit => 255 
add_column :users, :confirmed_at, :timestamp 
add_column :users, :confirmation_sent_at, :timestamp 
execute "UPDATE users SET confirmed_at = created_at, confirmation_sent_at = created_at" 
add_column :users, :reset_password_token, :string, :limit => 255 

add_column :users, :remember_token, :string, :limit => 255 
add_column :users, :remember_created_at, :timestamp 
add_column :users, :sign_in_count, :integer, :default => 0 
add_column :users, :current_sign_in_at, :timestamp 
add_column :users, :last_sign_in_at, :timestamp 
add_column :users, :current_sign_in_ip, :string, :limit => 255 
add_column :users, :last_sign_in_ip, :string, :limit => 255 

add_column :users, :failed_attempts, :integer, :default => 0 
add_column :users, :unlock_token, :string, :limit => 255 
add_column :users, :locked_at, :timestamp 

remove_column :users, :password 
remove_column :users, :persistence_token 

add_index :users, :email,    :unique => true 
add_index :users, :confirmation_token, :unique => true 
add_index :users, :reset_password_token, :unique => true 
add_index :users, :unlock_token,   :unique => true 

Notez que ici j'ai converti une colonne de mot de passe ordinaire dans une colonne cryptée bcrypt-pour Devise - si vous avez utilisé mots de passe chiffrés avec Authlogic, alors vous voudrez probablement simplement renommer la colonne (si nécessaire) et choisir le bon module de chiffrement dans config/initializers/devise.rb.

Pour référence, le « mettre au point » clause dans mon modèle utilisateur ressemble à ceci:

devise :database_authenticatable, :registerable, :recoverable, 
    :rememberable, :trackable, :validatable, :confirmable, :lockable, 
    :timeoutable, :authentication_keys => [ :login ] 

Notez que l'annulation :authentication_keys comme cela pour que les utilisateurs se connectent avec leur connexion plutôt que leur adresse e-mail me nécessaire de modifier certains des vues concevoir: rails generate devise:views, puis modifier les fichiers.

Espérons que cela aide un peu. Bonne chance!

+0

Excellente réponse! Je vous remercie! – Erik

+0

Juste ce que je cherchais. Merci! – jspooner

21

La réponse de sanityinc est géniale! Merci beaucoup!

Mais j'avais une autre version de authlogic avec des mots de passe cryptés et ma dernière jusqu'à la migration était:

rename_column :users, :crypted_password, :encrypted_password 

add_column :users, :confirmation_token, :string, :limit => 255 
add_column :users, :confirmed_at, :timestamp 
add_column :users, :confirmation_sent_at, :timestamp 
execute "UPDATE users SET confirmed_at = created_at, confirmation_sent_at = created_at" 
add_column :users, :reset_password_token, :string, :limit => 255 

add_column :users, :remember_token, :string, :limit => 255 
add_column :users, :remember_created_at, :timestamp 
rename_column :users, :login_count, :sign_in_count 
rename_column :users, :current_login_at, :current_sign_in_at 
rename_column :users, :last_login_at, :last_sign_in_at 
rename_column :users, :current_login_ip, :current_sign_in_ip 
rename_column :users, :last_login_ip, :last_sign_in_ip 

rename_column :users, :failed_login_count, :failed_attempts 
add_column :users, :unlock_token, :string, :limit => 255 
add_column :users, :locked_at, :timestamp 

remove_column :users, :persistence_token 
remove_column :users, :perishable_token 
remove_column :users, :single_access_token 

add_index :users, :email,    :unique => true 
add_index :users, :confirmation_token, :unique => true 
add_index :users, :reset_password_token, :unique => true 
add_index :users, :unlock_token,   :unique => true 

.. et il a très bien fonctionné pour MySQL.

+0

est-il possible de garder les utilisateurs connectés après la migration? – Gady

6

Si vous rencontrez une erreur 'hash invalide' lors de la connexion d'un utilisateur, ajoutez: encryptable dans le modèle User. J'ai migré d'authlogic à concevoir. Ma base de données est MySQL.

+0

Super apprécié. J'ai traversé les deux migrations ci-dessus, et c'était une bonne solution qui a fait gagner du temps. – Glenn

+0

C'était la solution pour moi, vu aucune mention de cela dans la documentation. – pingu

5

Si vous obtenez des erreurs de chiffrement, essayez de changer ces derniers dans devise.rb config:

config.stretches = 20 
config.encryptor = :authlogic_sha512