2011-01-11 22 views
19

Varias aplicaciones de Rails 2.3 usan Autentificación reposada, pero ese complemento parece tener algunos problemas con Rails 3. Al actualizar a Rails 3 he estado usando Devise. ¿Hay alguna forma de pasar sin problemas de Restful Authentication a Devise? ¿Alguien ha hecho una migración que muestra cómo actualizar el modelo de Usuario?Migración desde la autenticación reposada a Devise

Respuesta

14

He actualizado mi aplicación de Restful Authentication a Devise ya. Aquí está mi migración:

class AlterUsersForDevise < ActiveRecord::Migration 
    def self.up 
    remove_column :users, :name 
    change_column :users, :email, :string, :default => "", :null => false, :limit => 128 
    rename_column :users, :crypted_password, :encrypted_password 
    change_column :users, :encrypted_password, :string, :limit => 128, :default => "", :null => false 
    rename_column :users, :salt, :password_salt 
    change_column :users, :password_salt, :string, :default => "", :null => false, :limit => 255 
    add_column :users, :reset_password_token, :string 
    change_column :users, :remember_token, :string, :limit => 255 
    rename_column :users, :remember_token_expires_at, :remember_created_at 

    add_column :users, :sign_in_count, :integer, :default => 0 
    add_column :users, :current_sign_in_at, :datetime 
    add_column :users, :last_sign_in_at, :datetime 
    add_column :users, :current_sign_in_ip, :string 
    add_column :users, :last_sign_in_ip, :string 

    rename_column :users, :activation_code, :confirmation_token 
    change_column :users, :confirmation_token, :string, :limit => 255 
    rename_column :users, :activated_at, :confirmed_at 

    add_column :users, :confirmation_sent_at, :datetime 
    end 

    def self.down 
    add_column :users, :name, :string, :limit => 100, :default => "" 
    rename_column :users, :encrypted_password, :crypted_password 
    change_column :users, :crypted_password, :string, :limit => 40 
    rename_column :users, :password_salt, :salt 
    change_column :users, :salt, :string, :limit => 40 
    remove_column :users, :reset_password_token 
    change_column :users, :remember_token, :string, :limit => 40 
    rename_column :users, :remember_created_at, :remember_token_expires_at 

    remove_column :users, :sign_in_count 
    remove_column :users, :current_sign_in_at 
    remove_column :users, :last_sign_in_at 
    remove_column :users, :current_sign_in_ip 
    remove_column :users, :last_sign_in_ip 

    rename_column :users, :confirmation_token, :activation_code 
    change_column :users, :confirmation_token, :string, :limit => 40 
    rename_column :users, :confirmed_at, :activated_at 

    remove_column :users, :confirmation_sent_at 
    end 
end 

Mi aplicación no es en vivo hasta ahora. Así que utilizo el cifrado de contraseñas de Devise en lugar del de Autorización reposada. Si su aplicación ya está activa y tiene usuarios activos, debe configurar Devise para que use SHA1 desde Restful Authentication para encriptar y descifrar contraseñas. De lo contrario, todos sus usuarios deben solicitar una nueva contraseña.

Puede configurar esto en el inicializador del dispositivo.

Espero que ayude ...

+0

Gracias, esto funciona.Tuve un problema adicional que abordé en las 2 respuestas a continuación. –

2

que estaba teniendo problemas con el cifrado de la contraseña (pero he encontrado la respuesta, ver a mi otra respuesta). La aplicación anterior usaba una versión anterior de Restful Authentication. Que estaba manejando el cifrado de la contraseña de esta manera:

# before filter 
def encrypt_password 
    return if password.blank? 
    self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{login}--") if new_record? 
    self.crypted_password = encrypt(password) 
end 

# Encrypts some data with the salt. 
def self.encrypt(password, salt) 
    Digest::SHA1.hexdigest("--#{salt}--#{password}--") 
end 

# Encrypts the password with the user salt 
def encrypt(password) 
    self.class.encrypt(password, salt) 
end 

Si fijo del Legado config.encryptor-:restful_authentication_sha1 no funciona.

+0

Ver mi solución en otra respuesta. –

11

Así es como para superar el problema de las contraseñas:

Es necesario hacer un encriptador encargo de este modo:

# /config/initializers/devise_encryptor.rb 
require "digest/sha1" 

module Devise 
    module Encryptors 
    class OldRestfulAuthentication < Base 
     def self.digest(password, stretches, salt, pepper) 
     Digest::SHA1.hexdigest("--#{salt}--#{password}--") 
     end 
    end 
    end 
end 

Y a continuación, elija en devise.rb así:

config.encryptor = :old_restful_authentication 

Eso ¡Deberías hacerlo!

1

En mi caso funciona (Analizados authentication.rb y by_password.rb en edad restful_authentication joya):

config/inicializadores/devise.rb añadir lo siguiente:

config.encryptor = :restful_authentication 
config.stretches = 10 #REST_AUTH_DIGEST_STRETCHES frome Restful Authentication file config/initializers/site_key.rb 
config.pepper = 'mashauronilavrechkumyachik' #REST_AUTH_SITE_KEY frome Restful Authentication file config/initializers/site_key.rb 

aplicación/modelos/user.rb agregar: encriptable

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, 
     :encryptable, :omniauthable, :authentication_keys => [:login] 

config/inicializadores/devise_encryptor.rb crear con este presente:

# -*- encoding : utf-8 -*- 
require "digest/sha1" 

module Devise 
    module Encryptable 
    module Encryptors 
     class RestfulAuthentication < Base 

     def self.digest(password, stretches, salt, pepper) 
      digest = pepper 
      stretches.times do 
      digest = secure_digest(digest, salt, password, pepper) 
      end 
      digest 
     end 

     def self.secure_digest(*args) 
      Digest::SHA1.hexdigest(args.flatten.join('--')) 
     end 

     def self.encrypt_password 
      return if password.blank? 
      self.password_salt = make_token if new_record? 
      self.encrypted_password = encrypt(password) 
     end 

     def self.make_token 
      secure_digest(Time.now, (1..10).map{ rand.to_s }) 
     end 

     def self.encrypt(password) 
      self.password_digest(password, stretches, salt, pepper) 
     end 
     end 
    end 
    end 
end 
Cuestiones relacionadas