0

古い CakePHP サイトを Rails 4 にゆっくりと移行しようとしています。多大な労力が必要なため、サイトを徐々に移行する必要があります。一度に 1 つの部分のみを移行し、Active Admin から始めます。このようなことを行うことについて多くの質問を見てきましたが、考慮しなければならないトリッキーな追加事項がいくつかあります。

  1. CakePHP コードを変更できません
  2. CakePHP サイトを壊すことはできません
  3. CakePHP サイトは、ハッシュ化されたパスワードを「password」という名前のデータベース列に保存しますが、Devise はそれを好みません。「password」はプレーンテキストのパスワードであると想定し、その DB 列もオーバーライドしようとする厄介な習慣に陥っています。

サイト全体が Rails に移行されたら、アプリを Devise に移行する方法に関する無数の回答のいずれかを確実にフォローし始めることができますが、今のところ、既存のアプリで作業する必要があります。

ありがとう

4

2 に答える 2

1

無視できるgemをインストールし、デフォルトのスコープでパスワード列AS encrypted_pa​​sswordを選択することで、この問題を解決できました。醜いですが、機能します

class User < ActiveRecord::Base
  ignore_columns :password

  default_scope :select => "#{User.quoted_table_name}.*, #{User.quoted_table_name}.password AS encrypted_password"

  devise :database_authenticatable

  def valid_password?(password)
    hash = ::Digest::MD5.hexdigest("[SALT REDACTED]#{password}").downcase
    return hash == self.encrypted_password
  end
end
于 2014-01-31T22:11:55.367 に答える
0

私はこれを見つけました: http://www.slideshare.net/napcs/rails-and-legacy-databases-railsconf-2009そして彼のアドバイスに従って、SQLビューを作成してレガシーテーブルをまとめました。

これは私が自分で実行していたものです(Limesurveyの上にアプリケーションを追加しています):

CREATE VIEW `users` AS
SELECT `uid` as `id`,
       `users_name` as `username`,
       `email` as `email`,
       `password` as `encrypted_password`,
       `full_name` as `full_name`,
       `role_names` as `role_names`,
       `parent_id` as `parent_id`,
       `lang` as `lang`,
       `one_time_pw` as `one_time_pw`,
       `created` as `created_at`,
       `modified` as `updated_at`
FROM `lime_users`;"

問題は、ビューに挿入するために、ベース テーブルにデフォルト値がないすべての列を SQL ビューに含める必要があることです。これは、「醜い」列名をレールに適した列名に正規化する良い方法です。

私のユーザーモデル:

class User < ActiveRecord::Base
  before_save :save_encrypted_password
  self.primary_key = "id" # This needs to be declared, for some reason.

  def sha2(password)
    (Digest::SHA2.new << password).to_s
  end

  def valid_password?(password)
    return false if encrypted_password.blank?
    return Devise.secure_compare(sha2(password), self.encrypted_password)
  end
protected
  def save_encrypted_password
    if password == password_confirmation
      self.encrypted_password = sha2(password)
    else
      errors.add :password_confirmation, "has to match password"
    end
  end
end

データベースにあるモデルの制約 (null や一意の値などではない) を反映して、これ以上の問題を回避することもお勧めします。(難解なエラー メッセージを 1 時間近く調べた後、これを苦労して学びました。)

お役に立てれば。

于 2014-03-11T07:27:52.637 に答える