我正在研究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
)。我该如何验证?
答案 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
因此我们可以在models / user.rb
中覆盖它def valid_password?(password)
encrypted_password == password || super(password)
end