Ruby on rails BCrypt::Errors::InvalidHash(无效哈希):即使数据库中有凭据

Ruby on rails BCrypt::Errors::InvalidHash(无效哈希):即使数据库中有凭据,ruby-on-rails,ruby,bcrypt,Ruby On Rails,Ruby,Bcrypt,我正试图以此用户身份登录我的web应用程序 mysql> SELECT*FROM users -> ; +----+----------+-----------------+----------+ | id | username | password_digest | initials | +----+----------+-----------------+----------+ | 1 | Brett | brett | BK |

我正试图以此用户身份登录我的web应用程序

mysql> SELECT*FROM users
    -> ;
+----+----------+-----------------+----------+
| id | username | password_digest | initials |
+----+----------+-----------------+----------+
|  1 | Brett    | brett           | BK       |
+----+----------+-----------------+----------+
1 row in set (0.00 sec)
但一旦我这么做了,我就会犯这样的错误:

BCrypt::Errors::InvalidHash (invalid hash):
很明显,我有一个用户名和密码,所以我不确定为什么我不能登录。我怀疑这与BCrypt gem以及它如何接受密码有关,但我不知道。有什么想法吗

更新:我在服务器上发现一个不同的数据库,我的凭据如下所示

mysql> SELECT*FROM users;
+----+----------+--------------------------------------------------------------+----------+
| id | username | password_digest                                              | initials |
+----+----------+--------------------------------------------------------------+----------+
| 19 | Brett    | $2a$10$isws6DQxsJHzxCOI11miDesJPCNcQN2vfSzmsVpivBx020UshmqHG | BK       |
+----+----------+--------------------------------------------------------------+----------+
如何将密码设置为
brett
,并使用数字和字母的疯狂组合显示在数据库中?我只想使用命令行界面

这是我的用户类:

class User < ApplicationRecord 
  attr_protected :id 

  has_secure_password 
  has_many :chats, dependent: :destroy 
  has_many :cnotes 
  has_one :permission, dependent: :destroy 

  validates :password, confirmation: true 
  validates :username, uniqueness: true 

  def to_param username end 

  def check_permission(permission) 
    self.permission[permission] 
  end 
end
class用户
使用
具有安全密码将启用密码的BCrypt加密。换句话说,密码不会以明文形式存储在数据库中;相反,它们将被加密,存储为
密码摘要
,看起来就像是“数字和字母的疯狂组合”。这是件好事!如果您的数据库遭到破坏,第三方将无法访问密码

您可以在以下位置找到
has\u secure\u password
上的文档:

要将密码设置为brett
,您可以执行以下操作:

user = User.find_by(username: 'Brett')
user.password = 'brett'
user.password_confirmation: 'brett'
user.save
在控制器中,在注册期间,这将类似于以下内容

def create
  user = User.new user_params
  if user.save
    #do some stuff, redirect to a page for example redirect_to user
  else
     render "new"
  end
end
private 
def user_params
   params.require(:user).permit(:username, :password, :password_confirmation) 
end

然后,在登录时,您将使用
验证
方法验证用户输入的密码是否与数据库中存储的密码匹配。

这一问题的答案很大程度上取决于您如何设置用户模型。你是在使用Desive还是其他标准认证宝石?对不起,我对这一切都很陌生。这些疯狂的数字可能是你密码的散列。这使得有人无法反向工程回到您的实际密码。对密码应用相同的哈希算法将得到相同的值。我应该将此代码放在哪里设置密码?用户模型?@LLBrettK您可以在
rails控制台中运行该代码段。通常,类似这样的内容是控制器的一部分,控制器创建用户(例如,在注册期间)或某种形式的用户设置,用户可以在其中更改密码。