Rails在保存时截断哈希:

时间:2010-01-27 03:59:59

标签: ruby-on-rails activerecord

我有一个带有哈希密码字段的rails模型(惊讶,惊讶),经过一些操作后,长度为40个字符。我在脚本/控制台中生成一个用户,它显示如下:

#<User id: 1, firstname: "true", lastname: "false", username: "chaines51", hashed_password: "2Gr0GWvPunB3x5jomRTSTZJRIelC2RW103d7f3db">

然后我运行user_instance.save,返回true,然后用户看起来像这样:

#<User id: 1, firstname: "true", lastname: "false", username: "chaines51", hashed_password: "103d7f3db">

知道其他30多个角色发生了什么事吗?我将迁移中的字段从字符串更改为文本,但它仍然被截断

编辑:型号代码为:

require 'digest/sha1'

class User < ActiveRecord::Base
  validates_presence_of :username, :password, :password_confirmation, :firstname, :lastname
  validates_length_of :username, :within => 3..40
  validates_length_of :password, :within => 5..40
  validates_uniqueness_of :username
  validates_confirmation_of :password
  belongs_to :school

  attr_protected :id, :salt
  attr_accessor :password, :password_confirmation

  def self.random_string(len)
    #generate a random salt consisting of digits and letters.
    chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
    salt = ""
    1.upto(len) { |i| salt << chars[rand(chars.size-1)] }
    return salt
  end

  def password=(pass)
    @password=pass
    @salt = User.random_string(40-pass.length)
    self.hashed_password = User.encrypt(@password, @salt)
  end  

  def self.encrypt(pass, salt)
    hash = Digest::SHA1.hexdigest(pass+salt)
    hash.slice!(0..(40-pass.length-1))
    hash = salt+hash;
  end

  def self.checkhash(pass, hash)
    salt = hash.slice!(0..40-pass.length-1)
    rehash = User.encrypt(pass, salt)
    return rehash == (salt+hash)
  end

  def self.authenticate(login, pass)
    u = User.find_by_username(login)
    return nil if u.nil?
    return u if User.checkhash(pass, u.hashed_password)
    nil
  end
end

并且db / schema.rb是:

ActiveRecord::Schema.define(:version => 20100127034504) do

  create_table "categories", :force => true do |t|
    t.string "title"
  end

  create_table "questions", :force => true do |t|
    t.string   "question"
    t.string   "a"
    t.string   "b"
    t.string   "c"
    t.string   "d"
    t.string   "e"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "questions_quizzes", :id => false, :force => true do |t|
    t.integer  "app_id"
    t.integer  "category_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "quizzes", :force => true do |t|
    t.string  "title"
    t.integer "category_id"
  end

  create_table "schools", :force => true do |t|
    t.string  "name"
    t.integer "coach_id"
  end

  create_table "users", :force => true do |t|
    t.string   "firstname",                          :null => false
    t.string   "lastname",                           :null => false
    t.string   "username",                           :null => false
    t.boolean  "needs_pass",      :default => false
    t.integer  "school_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.boolean  "confirmed",       :default => false
    t.text     "hashed_password"
  end

end

1 个答案:

答案 0 :(得分:1)

显示模型代码和表信息表单db / schema.rb将非常有用。马上,我可以告诉你一个字符串列最多可以容纳255个字符,没有问题,所以可能还有其他错误。如果有什么限制,它很可能会在我上面提到的两个地方之一中显示出来。