我试图将旧的蛋糕php网站慢慢迁移到铁路4.由于需要大量的努力,因此需要逐渐移动该站点,一次只迁移一件,然后从主动admin开始。我已经看到了很多有关做这样的事情的问题,但是我需要考虑一些棘手的额外问题:
- 我无法修改cakephp代码
- 我无法打破cakephp网站
- CakePHP网站将其Hashed密码存储在名为"密码"的数据库列中,并且设计不喜欢。它期望"密码"是明文密码,并且已经陷入了一个讨厌的习惯,即也试图覆盖DB列。
一旦整个网站都迁移到铁轨,我当然可以开始遵循有关如何迁移的任何答案一个要设计的应用程序,但是现在我需要工作使用现有的应用
谢谢
我能够通过安装可忽略的宝石来解决此问题,然后在默认范围中选择"密码列"为engrypted_password。这很丑陋,但起作用
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
我找到了这个:http://www.slideshare.net/napcs/rails------------------------------------------------railsconf-2009遗产表。
这是我过去在我的上运行的东西(我在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
在数据库中的模型约束中反思(而不是零,唯一值等)也是一个好主意,以避免更多的陷阱。(经过将近一个小时的障碍,通过奥秘错误消息学习了这一点。)
希望这会有所帮助。