Недопустимый хеш-пароль Rails аутентифицируется в консоли ruby, но после повторного открытия - нет. Почему?

0

Я следую [lynda.com Ruby on Rails 5 Essential Training] [1] и очень застрял при создании системы входа в систему.

Проблема заключается в том, что в базе данных, похоже, используется другой хеш для того, что использует рельсы. Я все рассмотрел по причинам и исправлениям, и я понимаю, что сохраненный хэш и один rails работают разные, но почему и как я могу это исправить?

Я добавил:

bcrypt 3.1.11 gem установлен
password_digest столбец в таблице
has_secure_password для исправления файла модели

Я переместился вниз и снова вернусь, чтобы увидеть, есть ли проблемы с таблицей.

Пароль, хранящийся в базе данных, hashed - password_digest: $ 2a $ 10 $ AMHXZBl/zXQ9yHOR7uBSiOdsGloArDkxO

Я даже выполнил следующие шаги в консоли Ruby:

user.password = 'password'
user.password_confirmation = 'password'
user.save
user.authenticate('password')

Пароль сохраняется, и аутентификация вызывает правильную запись, но она не соответствует после перезапуска консоли или с помощью страницы входа на сервере rails.

Я получаю эту ошибку каждый раз:

BCrypt::Errors::InvalidHash (invalid hash):

app/controllers/cms_access_controller.rb:16:in 'attempt_login'

и неверная хэш-ошибка в браузере застряла здесь:

found_user = CmsUser.where(:username => params[:username]).first
  if found_user
    authorized_user = found_user.authenticate(params[:password])
  end
end

Вот журнал из рельсов:

Started POST "/cms_access/attempt_login" for 127.0.0.1 at 2018-01-02 17:59:18 +0800
Processing by CmsAccessController#attempt_login as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"YP2tiHyRfDhJhhuF+PPM0D+hA+6BMJW5YmTyZyLpT6nXs4NdhGyihVKZpoMaRl0oUsobnr6x5bYGBR75+huUjg==", "username"=>"username", "password"=>"[FILTERED]", "commit"=>"Login"}
[1m[36mCmsUser Load (0.4ms)[0m  [1m[34mSELECT  'cms_users'.* FROM 'cms_users' WHERE 'cms_users'.'username' = 'username' ORDER BY 'cms_users'.'id' ASC LIMIT 1[0m
Completed 500 Internal Server Error in 9ms (ActiveRecord: 0.4ms)



BCrypt::Errors::InvalidHash (invalid hash):

app/controllers/cms_access_controller.rb:16:in 'attempt_login'

Полный код irb следующим образом:

irb(main):001:0> u = CmsUser.first
   (0.4ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(REPLACE(REPLACE(REPLACE(@@sql_mode, 'STRICT_TRANS_TABLES', ''), 'STRICT_ALL_TABLES', ''), 'TRADITIONAL', ''), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
  CmsUser Load (0.2ms)  SELECT  'cms_users'.* FROM 'cms_users' ORDER BY 'cms_users'.'id' ASC LIMIT 1
=> #<CmsUser id: 1, first_name: "first name", last_name: "last name", email: "email", username: "username", password_digest: nil, created_at: "2018-01-02 14:48:42", updated_at: "2018-01-02 14:48:42">
irb(main):002:0> u.password = "password"
=> "password"
irb(main):003:0> u.password_confirmation = "password"
=> "password"
irb(main):004:0> u.save
   (0.3ms)  BEGIN
  SQL (0.4ms)  UPDATE 'cms_users' SET 'password_digest' = '$2a$10$gKAyDPTNzg.7Xnd7uatzuu0VWZNH6zGPA653RZ.5THB2Rziax1fyC', 'updated_at' = '2018-01-02 14:50:29' WHERE 'cms_users'.'id' = 1
   (1.1ms)  COMMIT
=> true
irb(main):005:0> u.authenticate("password")
=> #<CmsUser id: 1, first_name: "first name", last_name: "last name", email: "email", username: "username", password_digest: "$2a$10$gKAyDPTNzg.7Xnd7uatzuu0VWZNH6zGPA653RZ.5THB...", created_at: "2018-01-02 14:48:42", updated_at: "2018-01-02 14:50:29">

После запуска сервера rails и попытки входа в систему:

Started POST "/cms_access/attempt_login" for 127.0.0.1 at 2018-01-02 22:52:01 +0800
Processing by CmsAccessController#attempt_login as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"qF/U+46QhGZHYuEbfPTStRxryPpp0hIEt1TQIRVE5bgfEfoudm1a21x9XB2eQUNNcQDQilZTYgvTNTy/zbY+nw==", "username"=>"username", "password"=>"[FILTERED]", "commit"=>"Login"}
  CmsUser Load (0.4ms)  SELECT  'cms_users'.* FROM 'cms_users' WHERE 'cms_users'.'username' = 'username' ORDER BY 'cms_users'.'id' ASC LIMIT 1
Completed 500 Internal Server Error in 11ms (ActiveRecord: 0.8ms)



BCrypt::Errors::InvalidHash (invalid hash):

app/controllers/cms_access_controller.rb:16:in 'attempt_login'
Теги:
database
login

1 ответ

0

Попробуйте выполнить следующие действия:

found_user = CmsUser.find_by(:username => params[:session][:username].downcase)
if found_user && found_user.authenticate(params[:session][:password])
  #=> code to be here
else
  #=> code to be here
end

Надеюсь помочь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню