Rails усекает хеш при сохранении: - PullRequest
2 голосов
/ 27 января 2010

У меня есть модель 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 Ответ

1 голос
/ 27 января 2010

Показ кода модели и табличной формы db / schema.rb был бы очень полезен.Сразу скажу, что строковый столбец будет содержать до 255 символов без проблем, так что может быть что-то еще не так.Если что-то ограничивает, оно, скорее всего, покажет себя в одном из двух мест, которые я назвал выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...