0
如果用户在一行中请求2个密码重置链接,则只有最近一个有效。如何让Devise立即通知用户过期的密码重置令牌?
如果用户点击较旧的用户,他们不会立即通知令牌无效。他们被要求输入两次新密码。只有在提交时才通知该令牌无效。
有没有标准的方法来改变这种行为,所以立即通知用户他们使用了错误的链接?
如果用户在一行中请求2个密码重置链接,则只有最近一个有效。如何让Devise立即通知用户过期的密码重置令牌?
如果用户点击较旧的用户,他们不会立即通知令牌无效。他们被要求输入两次新密码。只有在提交时才通知该令牌无效。
有没有标准的方法来改变这种行为,所以立即通知用户他们使用了错误的链接?
我有点惊讶地发现这是标准行为 - 感谢您提出它!我可能会使用从Devise::PasswordsController
继承的自定义控制器,并简单地覆盖:edit
。麻烦的是,我们正在使用抽象用户(因为此时没有用户实际进行身份验证),所以我们无法对数据库中的特定标记进行检查,并且我们必须检查给定标记是否存在。
class PasswordsController < Devise::PasswordsController
before_filter :validate_reset_password_token, only: :edit
private
def validate_reset_password_token
recoverable = resource_class.find_by_reset_password_token(params[:reset_password_token])
redirect_to root_path unless (recoverable && recoverable.reset_password_period_valid?)
end
end
这将重定向,除非用户存在令牌传递。不过,您可以处理重定向/错误显示。
最后,在你的路由文件,更改密码使用设计出控制器:
devise_for :users, :controllers => { passwords: "passwords" }
注意事项:
reset_password_by_token
重置令牌定位模型实例的方法)顺便说一句,有没有办法告诉他们,他们使用了错误的链接,他们应该点击其他一,因为没有办法积极识别他们,因此无法知道他们已经产生了另一个有效的令牌。
“没有办法告诉他们,他们使用了错误的链接,他们应该点击另一个,因为没有办法在第一位肯定他们”......真的,但那肯定会是最常见的情况,所以我们仍然可以提供有用的指导。 “哎呀,这个链接是无效的,也许是因为你已经做了一个更新的密码重置,因为这一个?”或者其他东西 –
这几乎就是我所需要的,谢谢。我必须改变的一件事就是比较消化的标记(因为实际的标记不存储在数据库中)'digested_token = Devise.token_generator.digest(self,:reset_password_token,params [:reset_password_token])'then' recoverable = resource_class.find_by_reset_password_token(digested_token)' – denvaar