首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Devise + Legacy DB:“密码”栏

Devise + Legacy DB:“密码”栏
EN

Stack Overflow用户
提问于 2014-01-31 20:17:27
回答 2查看 940关注 0票数 0

我正试图慢慢地将一个旧的CakePHP站点迁移到Rails 4,因为需要大量的工作,所以需要逐步迁移该站点,一次只迁移一个部分,从Active Admin开始。我见过很多关于这样做的问题,但我需要考虑一些棘手的额外问题:

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

一旦整个站点被迁移到Rails,我当然可以开始跟踪关于如何迁移要设计的应用程序的无数答案,但是现在我需要使用现有的应用程序。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2014-01-31 22:11:55

我能够通过安装可忽略的gem来解决这个问题,并在默认范围内将密码列SELECTing为encrypted_password。它很丑,但很管用

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-03-11 07:27:52

我发现了以下内容:http://www.slideshare.net/napcs/rails-and-legacy-databases-railsconf-2009,并遵循他在创建sql视图以结束旧表方面的建议。

这是我以前在我的上面运行的程序(我在Limesurvey之上添加了一个应用程序):

代码语言:javascript
复制
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友好列名的好方法。

我的用户模型:

代码语言:javascript
复制
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

在数据库中的模型约束(非空值、唯一值等)中反映也是一个好主意,以避免出现更多的问题。(在经过近一小时的神秘错误信息后,我们终于学会了这一点。)

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21489265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档