ruby-on-rails authlogic devise

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.