ruby on rails - Migrando de Authlogic a Devise
ruby-on-rails (4)
Anteriormente implementé Authlogic para autorización en mi sitio. Ahora, sin embargo, me gustaría cambiar al uso de Devise, y me pregunto si alguien tiene alguna experiencia con esto. Tal vez alguien ha visto una publicación de blog sobre el tema?
Gracias.
Si encuentra un error de ''hash no válido'' cuando un usuario inicia sesión, agregue: encryptable en el modelo de Usuario. He migrado de authlogic a idear. Mi base de datos es MySQL.
Si obtiene errores de devise.rb
, intente cambiarlos en la configuración devise.rb
:
config.stretches = 20
config.encryptor = :authlogic_sha512
Yo mismo cambié de Authlogic a Devise recientemente y tampoco encontré ningún artículo. Sin embargo, en el caso simple, una vez que has descartado toda tu sesión de usuario y otro código relacionado con authlogic, la principal tarea consiste en convertir tu antigua tabla de usuarios al formato esperado por idee.
Mi vieja mesa se veía así:
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)
y determiné que la tabla debería contener al menos la siguiente información para el dispositivo (con muchas funciones opcionales habilitadas):
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 |
Así que definí una clase activerecord sin adornos en la clase de migración
class ConversionUser < ActiveRecord::Base
set_table_name "users"
end
y luego aquí está el código de migración "arriba" que terminé usando (con 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
Tenga en cuenta que aquí he convertido una columna de contraseña simple en una columna cifrada en brypt para Devise: si ha utilizado contraseñas encriptadas con Authlogic, entonces probablemente quiera cambiar el nombre de la columna (si es necesario) y elegir la correcta módulo de config/initializers/devise.rb
en config/initializers/devise.rb
.
Como referencia, la cláusula "idear" en mi modelo de Usuario se ve así:
devise :database_authenticatable, :registerable, :recoverable,
:rememberable, :trackable, :validatable, :confirmable, :lockable,
:timeoutable, :authentication_keys => [ :login ]
Tenga en cuenta que anulando :authentication_keys
esta manera para que los usuarios inicien sesión con su nombre de usuario en lugar de su dirección de correo electrónico me requirieron modificar algunas de las vistas de diseño: los rails generate devise:views
y luego editan los archivos.
Espero que esto ayude un poco. ¡Buena suerte!
la respuesta de sanityinc es genial! ¡Muchas gracias!
Pero tenía una versión diferente de authlogic con contraseñas encriptadas y mi migración final era:
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
.. y funcionó muy bien para MySQL.