0

我正在尝试将一个旧的 CakePHP 站点缓慢迁移到 Rails 4。由于需要大量工作,该站点需要逐步迁移,一次只迁移一个,并从 Active Admin 开始。我已经看到很多关于做这样的事情的问题,但是我需要考虑一些棘手的额外事情:

  1. 我无法修改 CakePHP 代码
  2. 我无法破坏 CakePHP 网站
  3. CakePHP 站点将其散列密码存储在名为“password”的数据库列中,而 Devise 不喜欢这样。它期望“密码”是明文密码,并且已经养成了试图覆盖该数据库列的坏习惯。

将整个站点迁移到 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 视图中包含基表中没有默认值的所有列,以便您插入到视图中。这是将“丑陋”的列名规范化为对 Rails 友好的列名的好方法。

我的用户模型:

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

反映在数据库中的模型约束(非空值、唯一值等)以避免更多陷阱也是一个好主意。(在阅读了近一个小时的晦涩错误消息后,才艰难地学会了这一点。)

希望这可以帮助。

于 2014-03-11T07:27:52.637 回答