Миграция с чистого хранилища паролей на authlogic - PullRequest
2 голосов
/ 19 июня 2010

В настоящее время я работаю над приложением Rails, которое хранит простые и понятные пароли (...).Поэтому я перехожу к аутентификации Authlogic со «стандартным» шифрованием SHA512.

Я сделал то, что отлично работает:

#file /models/user.rb
class User < ActiveRecord::Base

  acts_as_authentic { |c|
    c.transition_from_crypto_providers = [MyOwnNoCrypto, Authlogic::CryptoProviders::Sha512]
  } 
end

#file /lib/my_own_no_crypto.rb
class MyOwnNoCrypto
  def self.encrypt(*tokens)
    return tokens[0] # or tokens.join I guess
  end

  def self.matches?(crypted_password, *tokens)
    return crypted_password == tokens.join
  end
end

Это хорошо - и работает просто отлично - но яИнтересно, есть ли более сексуальный способ сделать это, возможно, с опцией Authlogic core?

Спасибо!

Ответы [ 2 ]

1 голос
/ 20 июня 2010

Я согласен с частью ответа thomasfedb , который предполагает однократный переход, а не использование модели перехода AuthLogic. В этом случае вы хотите зашифровать эти пароли как можно скорее, а не в следующий раз, когда пользователь входит в систему. Однако вместо задачи Rake я мог бы предложить выполнить миграцию:

# in db/migrate/nnnnnnnn_encrypt_passwords.rb:

class EncryptPasswords < ActiveRecord::Migration
  def self.up
    add_column :users, :crypted_password
    User.each do |u|
      u.encrypt_password!
    end
    remove_column :users, :password
  end

  def self.down
    raise IrreversibleMigration.new('Cannot decrypt user passwords')
  end
end
1 голос
/ 19 июня 2010

Лично я написал бы миграцию, чтобы перенести все незашифрованные пароли в зашифрованные.Вы можете определить свою собственную модель «скелета» в процессе миграции, чтобы обеспечить хороший низкоуровневый доступ.

...