запутался о том, как использовать bcrypt-ruby - PullRequest
0 голосов
/ 23 июня 2011

Я реализую схему проверки и использую гем bcrypt-ruby.

require 'bcrypt'

    class User < ActiveRecord::Base

      include BCrypt

      attr_accessor :password

      attr_accessible :name, :email, :password, :password_confirmation

      validates :password, :presence => true, :on => :create,
                           :confirmation => true,
                           :length => {:within => 6..12}

     before_save :encrypt_password

      def has_password?(submitted_password)
      self.encrypted_password == submitted_password # this calls a method in bcrypt    

    # File lib/bcrypt.rb, line 171
    #     def ==(secret)
    #       super(BCrypt::Engine.hash_secret(secret, @salt))
    #     end

      end

    private

      def encrypt_password

           self.encrypted_password = Password.create(password, :cost => 5)  
       end
    end

Теперь в консоли я создаю нового пользователя

>> user = User.create!(:name => "test", :email => "test@test.com", :password => "foobar", :password_confirmation => "foobar")

=> #<User id: 1, name: "test", email: "test@test.com", created_at: "2011-06-23 05:00:00", updated_at: "2011-06-23 05:00:00", encrypted_password: "$2a$10$I7Wy8NDMeVcNgOsE3J/ZyubiNAESyxA7Z49H4p1x5xxH...">

И если я проверяю действительный пароль, я делаю следующее:

>> user.has_password?("foobar")
=> true

но если я получу пользователя из базы данных, произойдет сбой:

user = User.find(1)
user.has_password?("foobar")
=> false

Почему это происходит и как я могу реализовать bcrypt, чтобы эта работа работала?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Как описано выше здесь , вы должны использовать класс пароля Bcrypt для использования ==

def has_password?(submitted_password)
  Bcrypt::Password.new(self.encrypted_password) == submitted_password
end
0 голосов
/ 23 июня 2011

Я думаю, что так как encrypted_password хранится в базе данных в виде строки, а не BCrypt :: Password, вы не вызываете BCrypt ==, а скорее String's ==.Вы должны создать экземпляр Пароля вокруг значения хеш-строки.Вот где бы я посмотрел.

...