Миграция с Restful-аутентификации на разработку - PullRequest
19 голосов
/ 11 января 2011

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

Ответы [ 5 ]

15 голосов
/ 16 марта 2011

Вот хорошее руководство по переходу от restful_authentication к разработке

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

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

14 голосов
/ 12 января 2011

Я уже обновил свое приложение с Restful Authentication до Devise.Вот моя миграция:

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 для шифрования и дешифрования паролей.В противном случае все ваши пользователи должны запросить новый пароль.

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

Надеюсь, это поможет ...

11 голосов
/ 13 января 2011

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

Вам нужно сделать собственный шифратор так:

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

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

2 голосов
/ 13 января 2011

У меня были проблемы с шифрованием пароля (но я нашел ответ, см. Мой другой ответ). Старое приложение использовало старую версию 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 Devise на :restful_authentication_sha1, это не сработает.

1 голос
/ 07 декабря 2014

В моем случае это работает (анализ authentication.rb и by_password.rb in old gem restful_authentication ):

config / initializers / 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

app / models / user.rb добавить: шифрование

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

config / initializers / 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...