1

データベースにパスワード列を設定したくないのに、「パスワード」の存在を検証しようとしています...パスワードをパスワードソルトに変換します。パスワード列がなくても、保存前の暗号化のパスワードの存在を検証するにはどうすればよいですか?

スキーマ:

migration "create users table" do
  database.create_table :users do
    primary_key :id
    text        :name
    text        :email
    text        :username
    text        :password_hash
    text        :password_salt
    index       :username, :unique => true
  end
end

ユーザーモデル:

class User < Sequel::Model

  require 'bcrypt'

  def before_save
    if password
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end

  def validate
    super
    validates_presence  [:password,:email] if new?
    validates_unique    [:email]
  end

  def self.authenticate(email, password)
    user = User.find(:email=>email)
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
      user
    else
      nil
    end
  end

  def encrypt_password
    if password.present?
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end

end

パスワードの存在を検証しようとすると、次のようになります。

NoMethodError: undefined method `password' for #<User @values={:email=>"foo@bar.com"}>
4

1 に答える 1

1

はい、わかった...

追加しました:

  attr_accessor :password

パスワード列に保存しようとせずに、その存在を検証します。ありがとう :)

于 2012-11-11T17:18:22.907 に答える