使用通过电子邮件发送的动态URL实现弹簧安全密码恢复的指南

我发现进行密码恢复非常困难,因为我以前从未做过。

到目前为止,我有网络应用程序,它具有:

Spring Security,其中密码被正确散列,用户角色实现并正常工作。

该策略暗示了堆栈溢出的研究:

  1. 用户点击忘记密码按钮,在其中输入他的电子邮件地址。
  2. 动态链接发送到电子邮件地址
  3. 用户打开电子邮件地址中的链接
  4. 这会将他重定向到密码重置页面

未知事项:

  • 如何赋予链接动态性——世代方法
  • 链接有一个超时 - 在这里发现了一些问题,但通常涉及自定义处理程序或扩展弹簧安全功能
  • 一种响应此类动态链接的请求映射方法
  • 临时链接存储方法 - 数据库、会话等 ?

如您所见,对于单个问题,该列表非常严重。因此,希望您能够提供有关如何逐步执行此操作的指南资源。我有点惊讶,我在Spring Security文档中找不到太多关于此的内容。谢谢。

我是学生,所以不知道这样做的行业最佳实践,特别是在Java的背景下,所以我真的希望任何人都能提供帮助。


答案 1

这个问题与Spring Security没有太大关系。如果您知道用户数据库和所使用的密码编码器的结构,它实际上只是实现涉及数据访问,Web控制器和发送电子邮件的工作流程。链接应包含一个随机令牌字符串(例如,使用和 base64 编码器),并且应将其存储在具有 userId 和时间戳的数据库中(用于验证链接有效的窗口)。控制器只需从传入请求中提取令牌,使用令牌从数据库中加载数据。它将检查时间戳,然后将用户转发到密码输入表单。根据要求,您可能还希望他们也回答一些其他安全问题。然后,您需要验证密码并进行编码,并将其存储在与重置链接表中存储的用户 Id 匹配的帐户中。运行批处理作业以从数据库中删除过期的链接也是有意义的。SecureRandom

Grails Spring Security UI插件已经有一个忘记密码的选项,您可以直接使用或用作参考。


答案 2

我已经为这个用例实现了一个JAVA项目。它在GitHub上,开源。

一切都有解释(如果缺少某些东西 - 让我知道...)


看一看:https://github.com/OhadR/Authentication-Flows

这是使用身份验证流的客户端 Web 应用,自述文件包含所有说明。它指导您实现:https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows


推荐