2012-12-03 60 views
0

我想让用户有机会更新一些用户信息。现在只有名字和电子邮件。用户需要键入当前密码才能授权更新。我尝试了几种方法,它归结为以下问题:Ruby on Rails - Bcyrpt用密码确认更新用户属性

在更新用户属性之前,我调用了“validate_password”方法。

users_controller.rb:

def update 
@user = User.find(params[:id]) 


respond_to do |format| 
    if validate_password(params[:password]) && @user.update_attributes(params[:user]) 
    format.html { redirect_to @user, notice: 'Account was successfully updated.' } 
    format.json { head :no_content } 
    else 
    format.html { render action: "edit" } 
    format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
end 

application_controller.rb:

def validate_password(pswd) 
if current_user.password_hash == BCrypt::Engine.hash_secret(pswd, current_user.password_salt) 
    true 
else 
    false 
end 

返回false即使有正确的密码为 “PSWD”。 我错过了什么吗?如果您知道正确的salt权限,您可以重新创建密码哈希值?

+0

'end'属于代码,格式不符合我的要求;) – Pickaxe

+0

以及为什么您确定在创建用户时有这种确切的散列?验证器也可以是单行的,如果根本没有,就只是条件。 –

+0

“验证”只是我的方法名称。也许误导它不是一个验证器。更多的是“检查正确的密码”的方法。创建哈希:http://pastebin.com/nv09i0ky – Pickaxe

回答

1

假设current_user.password_hash包含哈希创建使用BCrypt::Password#create,而不是

current_user.password_hash == BCrypt::Engine.hash_secret(...) 

尝试

BCrypt::Password.new(current_user.password_hash) == passwd 

不要做腌制自己。这是多余的,因为BCrypt已经腌制过。

朝好的方向迈出的另一步是放弃手写验证并使用现有的经过战斗测试的解决方案,例如, Devise

+0

哈希是这样创建的:http://pastebin.com/nv09i0ky(跟随railscast) – Pickaxe

+0

你可以使用'BCrypt :: Password#create'来创建它吗? – Jan

+0

对于登录,用户使用他的电子邮件和密码进行身份验证。 (http://pastebin.com/dvWRXsde)..工作没有问题。我现在试图实现的更简单(没有电子邮件)。我的主要目标是在使用宝石之前了解基础知识,为我完成所有工作。 (我还是个新手)。我看不出现在为什么会失败,但模型中的电子邮件身份验证正在运行 – Pickaxe

1

您还可以使用:

validates_presence_of :password, :on => :create 

这种方式更新时,你会避免密码验证。

相关问题