BCrypt::Errors::InvalidHash 在 SessionsController#create
BCrypt::Errors::InvalidHash in SessionsController#create
我已经尝试查看之前关于此错误的问题和答案,但解决方案似乎对我不起作用。该行抛出错误:
if customer && customer.authenticate(params[:session][:password_digest])
我可以注册一个用户(在一家公司下)并注册一家公司,但是每当我尝试登录用户时我都会收到这个 BCrypt 错误。我只开始使用 has_secure_password 东西等一旦我的用户模型和公司模型等到位,我后来才意识到不保护密码是愚蠢的。
即使我现在创建一个新用户,登录时仍然出现此错误。
我认为这可能是由于我与用户的关系所致? (也许完全不是,我对 Ruby 很陌生!)我的用户属于一家公司(多对一),当他们注册时,他们从列表中选择一家公司,以便在数据库。这是我与此错误相关的代码:
class SessionsController < ApplicationController
def new
end
def create
customer = Customer.find_by_email(params[:session][:email])
if customer && customer.authenticate(params[:session][:password_digest])
log_in customer #see sessions helper
remember customer #see sessions helper
redirect_to '/main'
else
redirect_to '/login'
end
end
def destroy
#session[:user_id] = nil
forget(current_customer)
session.delete(:customer_id)
@current_customer = nil
redirect_to '/'
end
end
class CreateCustomers < ActiveRecord::Migration
def change
create_table :customers do |t|
t.timestamps
t.references :business, foreign_key: true
t.timestamps
t.string :first_name
t.string :last_name
t.string :email
t.string :password_digest
t.string :remember_digest
t.string :role
end
end
end
class CustomersController < ApplicationController
def new
@customer = Customer.new
@businesses = Business.all
end
def create
@customer = Customer.create(customer_params)
@customer.save!
session[:customer_id] = @customer.id
redirect_to '/'
rescue ActiveRecord::RecordInvalid => ex
render action: 'new', alert: ex.message
end
private
def customer_params
params.require(:customer).permit(:first_name, :last_name, :business_no, :email, :password_digest, :business_id) #replace company with company ID
end
end
请帮帮我,我的头发都快掉了:(
您遇到的错误可能意味着为该用户存储的 password_digest
由于某种原因无效(可能是空的)。
输入一个 rails 控制台:rails console
并执行以下命令:
u = User.find_by(email: "your_user_email")
puts u.password_digest
看看输出是什么。
(也如您的问题的评论中所述,使用身份验证方法时应使用明文密码)
更新
您不应直接使用 password_digest
属性,而应使用两个属性:password
和 password_confirmation
(当您使用使用 has_secure_password
,因此您无需定义它们)。
所以在你的控制器中,而不是这个:
params.require(:customer).permit(:first_name, :last_name, :business_no, :email, :password_digest, :business_id) #replace company with company ID
你应该有:
params.require(:customer).permit(:first_name, :last_name, :business_no, :email, :password, :password_confirmation :business_id) #replace company with company ID
并相应地编辑您的表单,为 password
和 password_confirmation
提供输入。
现在,当您使用这些参数创建对象时,它会通过加密 password
和 password_confirmation
.[=24 中包含的明文自动将密码摘要分配给 password_digest
=]
我已经尝试查看之前关于此错误的问题和答案,但解决方案似乎对我不起作用。该行抛出错误:
if customer && customer.authenticate(params[:session][:password_digest])
我可以注册一个用户(在一家公司下)并注册一家公司,但是每当我尝试登录用户时我都会收到这个 BCrypt 错误。我只开始使用 has_secure_password 东西等一旦我的用户模型和公司模型等到位,我后来才意识到不保护密码是愚蠢的。 即使我现在创建一个新用户,登录时仍然出现此错误。
我认为这可能是由于我与用户的关系所致? (也许完全不是,我对 Ruby 很陌生!)我的用户属于一家公司(多对一),当他们注册时,他们从列表中选择一家公司,以便在数据库。这是我与此错误相关的代码:
class SessionsController < ApplicationController
def new
end
def create
customer = Customer.find_by_email(params[:session][:email])
if customer && customer.authenticate(params[:session][:password_digest])
log_in customer #see sessions helper
remember customer #see sessions helper
redirect_to '/main'
else
redirect_to '/login'
end
end
def destroy
#session[:user_id] = nil
forget(current_customer)
session.delete(:customer_id)
@current_customer = nil
redirect_to '/'
end
end
class CreateCustomers < ActiveRecord::Migration
def change
create_table :customers do |t|
t.timestamps
t.references :business, foreign_key: true
t.timestamps
t.string :first_name
t.string :last_name
t.string :email
t.string :password_digest
t.string :remember_digest
t.string :role
end
end
end
class CustomersController < ApplicationController
def new
@customer = Customer.new
@businesses = Business.all
end
def create
@customer = Customer.create(customer_params)
@customer.save!
session[:customer_id] = @customer.id
redirect_to '/'
rescue ActiveRecord::RecordInvalid => ex
render action: 'new', alert: ex.message
end
private
def customer_params
params.require(:customer).permit(:first_name, :last_name, :business_no, :email, :password_digest, :business_id) #replace company with company ID
end
end
请帮帮我,我的头发都快掉了:(
您遇到的错误可能意味着为该用户存储的 password_digest
由于某种原因无效(可能是空的)。
输入一个 rails 控制台:rails console
并执行以下命令:
u = User.find_by(email: "your_user_email")
puts u.password_digest
看看输出是什么。
(也如您的问题的评论中所述,使用身份验证方法时应使用明文密码)
更新
您不应直接使用 password_digest
属性,而应使用两个属性:password
和 password_confirmation
(当您使用使用 has_secure_password
,因此您无需定义它们)。
所以在你的控制器中,而不是这个:
params.require(:customer).permit(:first_name, :last_name, :business_no, :email, :password_digest, :business_id) #replace company with company ID
你应该有:
params.require(:customer).permit(:first_name, :last_name, :business_no, :email, :password, :password_confirmation :business_id) #replace company with company ID
并相应地编辑您的表单,为 password
和 password_confirmation
提供输入。
现在,当您使用这些参数创建对象时,它会通过加密 password
和 password_confirmation
.[=24 中包含的明文自动将密码摘要分配给 password_digest
=]