如何将新字符串与已加密的密码进行匹配

时间:2014-02-06 06:17:53

标签: ruby-on-rails ruby encryption devise

我正在研究rails 3.2.13项目。我使用devise插件(设计gem 3.2.2,1.4.2)进行身份验证。使用此插件,如何在将旧密码更改为新密码时验证current_password字段?或者,请建议我如何通过加密给定的字符串并将其与已保存的密码匹配而不使用设计插件来实现此目的。

例如:一位用户encrypted_password如下:

"$2a$10$VrawKYj6zp10XUxbixVzE.7d4QgYjQn9aiuzAuP7fp3PZOLMP5wbu"

更改密码时,如果我输入current_password,则应与上面的字符串匹配(encrypted_password == current_password)。我该如何验证?

2 个答案:

答案 0 :(得分:1)

我相信您需要将问题分解为以下步骤:

确定old_password是否实际上是用户的当前密码。

为此,您可以致电:

User.find_by_id([SOME_ID]).valid_password?(old_password)

如果返回true,则可以继续下一步以开始更改密码。如果没有,则old_password不正确,您不应允许更改密码。

valid_password?的实现可以在Devise gem的/lib/devise/models/database_authenticatable.rb文件中找到(在第40行左右)。您可以使用此实现来滚动自己的代码以验证密码。但是,如果你打电话给valid_password?,Devise几乎可以帮到你,所以滚动自己似乎没必要。

如果old_password有效,请验证new_password是否与confirm_new_password匹配。

if (new_password == confirm_new_password)
   .
   .
   .
end

如果匹配,则通过执行以下操作设置新密码:

u = User.find_by_id([SOME ID])
u.password = new_password
u.password_confirmation = confirm_new_password
u.save

您可以通过以下方式验证密码是否已更改:

u.valid_password?(new_password)

答案 1 :(得分:0)

使用current_password验证更新用户:

@user.update_with_password(account_update_params)
# account_update_params - should have :current_password, :password, :password_confirmation

这是Devise :: RegistrationsController中的默认行为。如果您希望更新用户没有密码,则应覆盖控制器的操作

class UsersController < Devise::RegistrationsController
  def update_resource(resource, params)
    # resource.update_with_password(params)
    resource.update_attributes(params)
  end
end

我是否理解您的想法允许用户使用加密和未加密(通常)密码登录?

我们有:

user.valid_password?('Password2').should

code on github

因此我们可以在models / user.rb

中覆盖它
def valid_password?(password)
  encrypted_password == password || super(password)
end