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

Posted

技术标签:

【中文标题】使用发送到电子邮件的动态 URL 实现 Spring Security 密码恢复的指南【英文标题】:Guide to implementing spring security password recovery with dynamic URL sent to email 【发布时间】:2013-06-17 16:19:45 【问题描述】:

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

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

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

该策略提示来自 *** 的研究:

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

未知的:

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

如您所见,对于单个问题,该列表非常严格。所以希望你能提供指导资源如何一步一步地做到这一点。我有点惊讶我在 Spring Security 文档中找不到太多关于此的内容。谢谢。

我是学生,所以不知道真正的行业最佳实践,尤其是在 Java 环境中,所以我真的希望任何人都能够提供帮助。

【问题讨论】:

我已经为这个用例实现了一个 JAVA 项目。它在 GitHub 上,开源。你可以看看:github.com/OhadR/oAuth2-sample/tree/master/authentication-flows 【参考方案1】:

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

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

【讨论】:

伟大、简单、简洁。我相信电子邮件地址+时间戳(作为盐)哈希生成可以完成链接生成的工作?也只是为了快速参考以响应动态链接,我使用类似:@RequestMapping(value="/var/name", method = RequestMethod.GET) 为什么要使用哈希?无论如何,您仍然需要存储令牌以验证它,并且时间戳是可以猜测的。如果我知道有人请求重置并且知道他们的电子邮件,我可以在合适的窗口中遍历所有可能的时间戳,直到系统允许我进入。使用随机字节作为链接令牌,并使其足够长,以至于你不这样做'不必担心(例如 16 个字节)。 我已经实现了类似于 Luke 的描述的东西,只是没有使用数据库;相反,我使用加密来加密链接中的数据,因此我不必访问数据库。如果您有兴趣,请在此处查看我的答案,并在此处找到所有相关链接【参考方案2】:

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

对所有事情都有解释(如果缺少某些东西 - 让我知道...)

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

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

【讨论】:

这是否足够稳定以适应生产使用? 这是个好问题。简而言之:是的。请注意,对于生产,每个(通常)都有自己的需求。例如,有些公司需要“秘密提问”机制,我没有实施。但这是一个很好的基础,可以从头开始,并添加任何需要的东西。查看自述文件。如果有不清楚的地方,请告诉我。是的 - 它很稳定:-) 注意:我已经更改了答案中的链接。看看.. 嗨@OhadR:我指的是你的项目,它对我很有用,我收到了一个异常:AuthenticationFlowsProcessorImpl - Authentication failed;嵌套异常是 javax.mail.AuthenticationFailedException,UserActionController - 帐户被锁定或不存在,我检查并且用户数据已插入 db @KhanhLuongVan 我认为您应该在堆栈溢出中打开一个新的“问题”,其中包含所有详细信息。跟踪和回答会更好,并且可能会帮助其他人...请不要忘记用“身份验证流程”标记您的问题... 感谢@OhadR:我创建了新问题并遇到了一些问题,希望您支持:这是我的票:***.com/questions/43067900/…

以上是关于使用发送到电子邮件的动态 URL 实现 Spring Security 密码恢复的指南的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MVC 中获取站点的基本 URL [重复]

从 codeigniter 中的视图发送动态电子邮件附件

在 GatsbyJS 上获取 URL 参数

使用 azure 逻辑应用将 blob 从 azure 存储帐户动态发送到电子邮件

ajax实现动态URL

在电子邮件正文中发送带有动态内容的图像