2010-10-01 27 views
38

In precedenza ho implementato Authlogic per l'autorizzazione sul mio sito. Ora invece desidero passare a usare Devise e mi chiedo se qualcuno abbia qualche esperienza con questo. Forse qualcuno ha visto un post sul blog sull'argomento?Migrazione da Authlogic a Devise

Grazie.

+0

Documentazione completa per la migrazione da Authlogic di escogitare. https://sunilsharma3639.wordpress.com/2014/06/11/rails-authentication-authlogic-to-devise/ – sunil

risposta

48

Sono passato da Authlogic a Devise di recente e inoltre non ho trovato nessun articolo. Tuttavia, nel caso semplice, una volta che hai gettato via tutti i tuoi user_session e altri codici relativi a authlogic, il pezzo principale di lavoro è convertire la tabella dei vecchi utenti nel formato previsto da idea.

mio vecchio tavolo si presentava così:

 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) 

e ho deciso che la tabella dovrebbe contenere almeno le seguenti informazioni per la disposizione testamentaria (con molte caratteristiche opzionali abilitato):

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 | 

Così ho definito una classe di attiverecord disadorno nella classe di migrazione

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

e il n ecco la "up" codice di migrazione ho finito per usare (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 

Si noti che qui ho convertito una colonna password di pianura in una colonna bcrypt crittografato per Devise - se avete usato password crittografate con Authlogic, allora probabilmente vorrai semplicemente rinominare la colonna (se necessario) e scegliere il modulo di crittografia corretto in config/initializers/devise.rb.

Per riferimento, la clausola di "inventare" nel mio modello User assomiglia a questo:

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

Si noti che l'override :authentication_keys come questo modo che gli utenti accedere con il proprio login piuttosto che il loro indirizzo e-mail mi ha richiesto di modificare alcune delle viste elaborate: rails generate devise:views, quindi modificare i file.

Spero che questo aiuti un po '. In bocca al lupo!

+0

Ottima risposta! Grazie! – Erik

+0

Proprio quello che stavo cercando. Grazie! – jspooner

21

La risposta di sanityinc è fantastica! Grazie mille!

ma ho avuto una versione diversa di Authlogic con password criptate e la mia finale fino migrazione 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 

.. e ha funzionato grande per MySQL.

+0

c'è un modo per mantenere gli utenti registrati dopo la migrazione? – Gady

6

Se si verifica un errore di "hash non valido" durante l'accesso di un utente, aggiungere: crittografabile nel modello Utente. Sono migrato da authlogic a ideare. Il mio database è MySQL.

+0

Super apprezzato. Ho passato entrambe le migrazioni di cui sopra, e questa è stata una bella correzione che ha risparmiato un po 'di tempo. – Glenn

+0

Questa era la soluzione per me, non ne ho parlato nella documentazione. – pingu

5

Se stai ricevendo errori Encryptor, prova a cambiare queste in devise.rb config:

config.stretches = 20 
config.encryptor = :authlogic_sha512