Ruby on rails BCrypt::Errors::InvalidHash(无效哈希):即使数据库中有凭据
我正试图以此用户身份登录我的web应用程序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 |
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控制台中运行该代码段。通常,类似这样的内容是控制器的一部分,控制器创建用户(例如,在注册期间)或某种形式的用户设置,用户可以在其中更改密码。