在我的rails 3.1应用程序中,我想为用户创建并过期随机密码。我正在使用devise gem.Any插件可用于expiring password
一段时间吗?
或者请给我一些合理的建议来实现这个功能
请认为我是新手。
答案 0 :(得分:4)
创建密码时,请记下创建密码的时间。然后,在使用密码时,请检查密码是否在24小时前创建。
根据您使用的框架,此功能(或类似功能)可能已存在于框架内,或者可能已作为插件存在。如果不是,则实施起来并不是特别困难。您只需要在数据存储中添加一个额外的列来保存密码创建日期/时间,以及在密码创建和密码使用方面的一些额外逻辑。
答案 1 :(得分:4)
听起来你只想让密码失效一次。如果您希望定期(例如每隔几个月)进行一次,或者如果您想阻止用户重新使用密码,则会变得更加复杂。
取自我正在处理的应用程序:
app / models / user.rb(假设你的名字是你的名字):
def password_should_expire?
# your logic goes here, remember it should return false after the password has been reset
end
应用程序/控制器/ application_controller.rb
before_filter :check_password_expiry
def check_password_expiry
return if !current_user || ["sessions","passwords"].include?(controller_name)
# do nothing if not logged in, or viewing an account-related page
# otherwise you might lock them out completely without being able to change their password
if current_user.password_should_expire?
@expiring_user = current_user # save him for later
@expiring_user.generate_reset_password_token! # this is a devise method
sign_out(current_user) # log them out and force them to use the reset token to create a new password
redirect_to edit_password_url(@expiring_user, :reset_password_token => @expiring_user.reset_password_token, :forced_reset => true)
end
end
答案 2 :(得分:2)
查看Devise Security Extension gem:
https://github.com/phatworx/devise_security_extension
我一直在使用它来过期密码和存档密码(以确保不会重复使用旧密码),没有任何问题。
答案 3 :(得分:0)
@ Jeriko的答案包含一些旧代码,这里是编辑
在model / user.rb中:
def password_should_expire?
if DateTime.now() > password_changed_at + 30.seconds
return true;
else
return false;
end
end
在应用程序控制器中:
before_filter :check_password_expiry
def check_password_expiry
return if !current_user || ["sessions","passwords"].include?(controller_name)
# do nothing if not logged in, or viewing an account-related page
# otherwise you might lock them out completely without being able to change their password
if current_user.password_should_expire?
@expiring_user = current_user # save him for later
@expiring_user.set_reset_password_token! # this is a devise method
sign_out(current_user) # log them out and force them to use the reset token to create a new password
redirect_to edit_password_url(@expiring_user, :reset_password_token => @expiring_user.reset_password_token, :forced_reset => true)
end
end