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

Java 使用发送到电子邮件的动态URL实现spring安全密码恢复指南,java,spring-security,password-recovery,forgot-password,Java,Spring Security,Password Recovery,Forgot Password,我发现做密码恢复很困难,因为我以前从未做过 到目前为止,我有一个web应用程序,它有: Spring安全性,密码被正确地散列,用户角色被正确地实现和工作 该策略暗示了stackoverflow的研究: 用户点击忘记密码按钮,输入他的电子邮件地址 动态链接被发送到电子邮件地址 用户打开电子邮件地址中的链接 这会将他重定向到密码重置页面 未知的是: 如何赋予链接动态性-世代方法 链接有一个超时-这里发现了一些问题,但通常涉及自定义处理程序或对spring安全功能的扩展 一种请求映射方法来响应这种动

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

到目前为止,我有一个web应用程序,它有:

Spring安全性,密码被正确地散列,用户角色被正确地实现和工作

该策略暗示了stackoverflow的研究:

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

    • 如何赋予链接动态性-世代方法
    • 链接有一个超时-这里发现了一些问题,但通常涉及自定义处理程序或对spring安全功能的扩展
    • 一种请求映射方法来响应这种动态链接
    • 临时链接存储方法-数据库、会话等
    正如你所看到的,对于一个问题,这个列表是非常严格的。所以我希望你们能够提供指导资源,指导你们如何一步一步地去做。我有点惊讶,我在Spring安全文档中找不到太多关于这个的内容。谢谢


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

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


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

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

    每件事都有解释(如果遗漏了什么,请告诉我…)


    看看:

    这是一个客户端web应用程序,它使用auth流,自述文件包含所有解释。它指导您实施:

    很棒,简单明了。我相信EmailAddress+时间戳(如salt)散列生成可以完成链接生成的工作?另外,为了快速响应动态链接,我使用了如下内容:@RequestMapping(value=“/var/{name}”,method=RequestMethod.GET)为什么要使用哈希?无论如何,您仍然需要存储令牌以验证它,并且时间戳是可猜测的。如果我知道有人请求重置并知道他们的电子邮件,我可以在一个合适的窗口上重复所有可能的时间戳,直到系统允许我进入。使用随机字节作为链接令牌,并使其足够长,您不必担心它(例如,16字节)。我实现了类似于Luke描述的东西,只是没有使用DB;相反,我使用加密来加密链接中的数据,因此我不必访问数据库。如果您感兴趣,请查看我在这里的回答,并在那里找到所有相关的linksI都为这个用例实现了一个JAVA项目。它位于GitHub上,开源。你可以看看:这是否足够稳定,以适应生产使用?这是一个很好的问题。简言之:是的。请注意,对于生产,每个(通常)都有自己的需求。例如,有一些公司需要“秘密问题”机制,但我没有实施。但这是一个很好的基础,可以从中开始,并添加任何需要的内容。看看自述。如果有什么不清楚,请告诉我。是的-它是稳定的:-)注意:我已经更改了答案中的链接。看一看..嗨@OhadR:我指的是你的项目,它对我很有用,我收到了一个异常:AuthenticationFlowsProcessImpl-Authentication失败;嵌套的异常是javax.mail.AuthenticationFailedException,UserActionController-帐户已锁定或不存在,我已检查并插入了用户数据db@KhanhLuongVan我认为您应该在stack overflow中打开一个新的“问题”,并提供所有细节。这将更好地跟踪和回答,并可能帮助其他人。。。请不要忘记在您的问题上添加“身份验证流”…谢谢@OhadR:我创建了一个新问题,有一些问题,希望您支持:这是我的票: