2010-10-01 16 views
38

Implementé Authlogic anteriormente 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?Migración de Authlogic a Devise

Gracias.

+0

documentación completa para migrar de authlogic idear. https://sunilsharma3639.wordpress.com/2014/06/11/rails-authentication-authlogic-to-devise/ – sunil

Respuesta

48

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 mesa de edad era la siguiente:

 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 yo determinado que la mesa tendría que contener al menos la siguiente información para idear (con muchas características opcionales habilitado):

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 la n aquí está el "arriba" código de migración 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í me he convertido una columna contraseña al descubierto en una columna bcrypt-cifrado para Diseñar - si usted ha utilizado contraseñas encriptadas con Authlogic, entonces es probable que desee cambiar el nombre de la columna (si es necesario) y elegir el módulo de cifrado correcto en config/initializers/devise.rb.

Como referencia, la cláusula de "diseñar" en mi modelo de usuario se parece a esto:

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

Tenga en cuenta que anulando :authentication_keys así para que los usuarios inician sesión con su nombre de usuario en lugar de su dirección de correo electrónico me requiere para modificar algunas de las vistas de diseño: rails generate devise:views, luego edite los archivos.

Espero que esto ayude un poco. ¡Buena suerte!

+0

¡Excelente respuesta! ¡Gracias! – Erik

+0

Justo lo que estaba buscando. ¡Gracias! – jspooner

21

La respuesta de sanityinc es genial! ¡Muchas gracias!

pero yo tenía una versión diferente de authlogic con contraseñas cifradas y mi última hasta la migración 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.

+0

¿hay alguna manera de mantener a los usuarios conectados después de la migración? – Gady

6

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 para diseñar. Mi base de datos es MySQL.

+0

Muy apreciado. He pasado por las dos migraciones anteriores, y esta fue una buena solución que le ahorró tiempo. – Glenn

+0

Esta fue la solución para mí, no la mencioné en la documentación. – pingu

5

Si está recibiendo errores dispositivo de cifrado, intente cambiar estos en devise.rb config:

config.stretches = 20 
config.encryptor = :authlogic_sha512