使用发送到电子邮件的动态URL实现Spring安全密码恢复的指南

时间:2013-06-20 17:22:22

标签: java spring-security password-recovery forgot-password

我发现很难进行密码恢复,因为我之前从未这样做过。

到目前为止,我的网络应用程序包含:

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

该策略暗示了stackoverflow的研究:

  1. 用户点击忘记密码按钮,输入他的电子邮件地址。
  2. 动态链接已发送至电子邮件地址
  3. 用户打开电子邮件地址中的链接
  4. 将重定向到密码重置页面
  5. 未知之处:

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

    正如您所看到的,对于单个问题,列表非常严重。因此希望您能够提供指导资源,以便逐步完成。我有点惊讶我在Spring Security文档中找不到这个。感谢。

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

2 个答案:

答案 0 :(得分:19)

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

Grails Spring Security UI插件已经有forgot password选项,您可以直接使用它,也可以用作参考。

答案 1 :(得分:5)

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

对所有事情都有解释(如果缺少某些东西 - 请告诉我......)


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

这是使用auth-flow的客户端Web应用程序,README包含所有解释。它指导您实施: https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows