login_engineをrestful_authenticationに移行する

railsが2.0になってしまった昨今、いつまでもlogin_engineを使っていると時代に取り残されそうなので、restful_authenticationへの移行を試みた。どうにか動き始めたので手順を公開。

まずはモデルを移行する。これには、db/migrateに以下のようなコードを入れておいて、rake db:migrateする。

class MigrateUsers < ActiveRecord::Migration
  def self.up
    rename_column("users",  "salted_password", "crypted_password")
    add_column("users", "state", :string, {:null => :no, :default => 'passive'})
    add_column("users", "remember_token", :string)
    add_column("users", "remember_token_expires_at", :datetime)
    add_column("users", "activation_code", :string, {:limit => 40})
    add_column("users", "activated_at", :datetime)
    add_column("users", "deleted_at", :datetime)
    User.find(:all).each { |user|
      if user.deleted != 0
        user.state = "deleted"
        user.deleted_at = user.delete_after
      elsif user.verified == 0
        user.state = "pending"
        #user.activation_code = user.security_token
      else
        user.state = "active"
      end
      user.save
    }
  end

  def self.down
    raise ActiveRecord::IrreversibleMigration, "Can't recover"
  end
end

ここで更に、login_engineとresful_authenticationでは、パスワードの暗号化の方法が違うので、app/model/user.rbを開いて、関数「self.encrypt」を以下のように修正する

修正前:

def self.encrypt(password, salt)
  Digest::SHA1.hexdigest("--#{salt}--#{password}--")
end

修正後:

def self.encrypt(password, salt)
  systemsalt = "your-salt-here"
  spassword = Digest::SHA1.hexdigest("#{systemsalt}--#{password}--}")[0..39]
  Digest::SHA1.hexdigest("#{systemsalt}--#{salt}#{spassword}--}")[0..39]
end

「systemsalt」となっている部分は、login_engineで

module LoginEngine
  config :salt, "your-salt-here"
end

として設定していた文字列と同じものにすること。

私の環境では、これで以前のアカウントデータでログイン可能になった。