2010-01-27 3 views
2

J'ai un modèle de rails avec un champ de mot de passe haché (surprise, surprise), qui après une manipulation, est de 40 caractères. Je produis un utilisateur dans le script/console et il apparaît comme suit:Rails tronque hachage sur enregistrer:

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

Je lance alors user_instance.save, qui retourne vrai, et l'utilisateur regarde alors comme ceci:

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

Toute idée arrive aux 30 autres personnages? J'ai changé le champ de la migration de chaîne au texte, mais il devient encore tronquée

EDIT: Le code modèle est:

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 

et db/schema.rb est:

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 
+0

Merci pour les articles. La base de données ne ressemble pas à un problème (bien que si je suis en mode de débogage paranoïaque, j'essaierais probablement de définir d'autres champs sur 10 caractères et de voir s'ils sont tronqués! –

+0

Avez-vous regardé dans la base de données (en utilisant psql, .?. mysqladmin, ou etc.) pour voir ce qui se est stocké –

Répondre

1

L'affichage du code du modèle et du formulaire d'informations sur la table db/schema.rb serait très utile. Tout de suite, je peux vous dire qu'une colonne de chaîne peut contenir jusqu'à 255 caractères sans problème, donc il pourrait y avoir quelque chose d'autre en faute. Si quelque chose est restrictif, il se montrera très probablement dans l'un des deux endroits que j'ai nommés ci-dessus.

+0

fait et fait, je ne vois rien hors de l'ordinaire (en plus d'un modèle assez terriblement écrit), mais je ne serais pas ici si j'affichait fait: P –

+0

Je viens de remarquer quelque chose d'intéressant - dans les extraits de code d'origine ci-dessus, les deux versions ont un identifiant, ce qui signifie que les deux versions ont déjà été sauvegardées une seule fois, pouvez-vous aller au script/console et créer un nouvel utilisateur? tout le travail supplémentaire, mais c'est le monde amusant du débogage :) –

+0

alors qu'est-ce qui est enregistré dans la base de données, exactement? Aussi est-il seulement tronqué quand l'enregistrement se produit? – rogerdpack

Questions connexes