38 votes

Migration d'Authlogic vers Devise

J'ai déjà mis en œuvre Authlogic pour l'autorisation sur mon site. Cependant, je souhaite maintenant passer à Devise et je me demande si quelqu'un a de l'expérience dans ce domaine. Peut-être quelqu'un a-t-il vu un article de blog sur le sujet ?

Nous vous remercions.

48voto

sanityinc Points 9156

Je suis moi-même passé récemment d'Authlogic à Devise et je n'ai pas non plus trouvé d'articles. Cependant, dans le cas simple, une fois que vous avez jeté tous vos user_session et autres codes liés à Authlogic, le travail principal consiste à convertir votre ancienne table users au format attendu par Devise.

Mon ancienne 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 j'ai déterminé que le tableau devrait contenir au moins les informations suivantes pour l'appareil (avec de nombreuses fonctions optionnelles activées) :

 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 activerecord sans fioritures dans la classe de migration

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

et voici le code de migration "vers le haut" que j'ai fini par utiliser (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 qu'ici, j'ai converti une colonne de mots de passe simples en une colonne cryptée bcrypt pour Devise -- si vous avez utilisé des mots de passe cryptés avec Authlogic, vous voudrez probablement renommer la colonne (si nécessaire) et choisir le module de cryptage correct dans la section config/initializers/devise.rb .

À titre de référence, la clause "devise" de mon modèle d'utilisateur se présente comme suit :

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

Il convient de noter que le fait de remplacer :authentication_keys Comme je l'ai dit plus haut, pour que les utilisateurs se connectent avec leur identifiant plutôt qu'avec leur adresse électronique, j'ai dû modifier certaines vues de devise : rails generate devise:views puis modifiez les fichiers.

J'espère que cela vous aidera un peu. Je vous souhaite bonne chance !

21voto

Michael Romanenko Points 363

La réponse de sanityinc est excellente ! Merci beaucoup !

Mais j'avais une version différente d'authlogic avec des mots de passe cryptés et ma migration finale a été :

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 cela fonctionnait très bien pour MySQL.

6voto

cactis Points 147

Si vous rencontrez une erreur 'invalid hash' lorsqu'un utilisateur se connecte, ajoutez :encryptable dans le modèle de l'utilisateur. J'ai migré d'authlogic à devise. Ma base de données est MySQL.

5voto

dazonic Points 555

Si vous obtenez des erreurs d'encryptage, essayez de les modifier dans le fichier devise.rb config :

config.stretches = 20
config.encryptor = :authlogic_sha512

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X