2014-02-28 64 views
0

如果用户在一行中请求2个密码重置链接,则只有最近一个有效。如何让Devise立即通知用户过期的密码重置令牌?

如果用户点击较旧的用户,他们不会立即通知令牌无效。他们被要求输入两次新密码。只有在提交时才通知该令牌无效。

有没有标准的方法来改变这种行为,所以立即通知用户他们使用了错误的链接?

回答

1

我有点惊讶地发现这是标准行为 - 感谢您提出它!我可能会使用从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重置令牌定位模型实例的方法)

顺便说一句,有没有办法告诉他们,他们使用了错误的链接,他们应该点击其他一,因为没有办法积极识别他们,因此无法知道他们已经产生了另一个有效的令牌。

+0

“没有办法告诉他们,他们使用了错误的链接,他们应该点击另一个,因为没有办法在第一位肯定他们”......真的,但那肯定会是最常见的情况,所以我们仍然可以提供有用的指导。 “哎呀,这个链接是无效的,也许是因为你已经做了一个更新的密码重置,因为这一个?”或者其他东西 –

+0

这几乎就是我所需要的,谢谢。我必须改变的一件事就是比较消化的标记(因为实际的标记不存储在数据库中)'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

相关问题