2011-01-11 2 views
19

Несколько приложений Rails 2.3 используют Restful Authentication, но у этого плагина, похоже, есть некоторые проблемы с Rails 3. При обновлении до Rails 3 я использовал Devise. Есть ли способ плавно перейти от Restful Authentication to Devise? Кто-нибудь сделал миграцию, которая показывает, как обновить модель пользователя?Миграция от ненадежной аутентификации для разработки

ответ

14

Я обновил мое приложение от Restful Authentication, чтобы разработать уже. Вот моя миграция:

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 

Мое приложение пока не переведено. Поэтому я использую шифрование паролей от Devise, а не от Restful Authorization. Если приложение уже доступно, и у вас есть активные пользователи, вы должны настроить Devise на использование SHA1 из Restful Authentication для включения и расшифровки паролей. В противном случае все ваши пользователи должны запросить новый пароль.

Вы можете настроить это в инициализаторе разработки.

Надежда, что помогает ...

+0

Спасибо, это работает.У меня была еще одна проблема, о которой я говорил в двух ответах ниже. –

2

У меня были проблемы с шифрованием пароля (но я нашел ответ, увидеть мой другой ответ). В старом приложении использовалась старая версия Restful Authentication. шифрование пароля, как так он обрабатывал:

# 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 

Если установить Разрабатывают-х config.encryptor к :restful_authentication_sha1 он не работает.

+0

См. Мое решение в другом ответе. –

11

Вот как преодолеть проблему паролей:

Вам нужно сделать заказ шифратор так:

# /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 

А затем выбрать его в devise.rb так:

config.encryptor = :old_restful_authentication 

Это должен это сделать!

15

Вот хорошее руководство по миграции из restful_authentication разработать

https://github.com/plataformatec/devise/wiki/How-To:-Migrate-from-restful_authentication-to-Devise

Причина редактирования: перед ссылка взял людей на пустую страницу.

+0

исправил ссылку, которая ранее приводила к пустой странице, в которой говорилось: «Создать новую страницу». – Jay

1

В моем случае это работает (authentication.rb анализируются и by_password.rb в старый драгоценный камень restful_authentication):

конфигурации/Инициализаторы/devise.rb добавить следующее:

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 

приложение/модели/пользователь.rb add: encryptable

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

конфигурации/Инициализаторы/devise_encryptor.rb создать с этим следующим образом:

# -*- 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 
Смежные вопросы