1

我有一个可以在不同场景中调用的弹簧控制器方法。这是一个例子......

@RequestMapping("/resetpassword")
public ModelAndView resetpassword( @Valid @ModelAttribute("resetpasswordForm") ResetPawdFormForm resetPawdFormForm, ModelAndView modelAndView){

...此方法可以在 3 种不同的情况下执行....

  1. 使用来自发送到用户电子邮件的用户重置密码链接的超链接.. 例如:localhost/myApp/login/resetpassword// 在这里我可以在 DB 中验证 userID 和 activationSecretCode 并让用户重置密码

  2. 用户可以从用户设置页面点击重置密码链接。例如:由于用户已经来自用户设置页面,我可以验证 userSession 并允许他重置密码

  3. 用户可以首次登录成功,但由于管理员要求重置初始默认密码,因此被迫重置密码。例如:在这个用户中既没有会话,也没有传递任何激活码来验证。登录方法验证用户 ID/默认密码并重定向到重置密码映射(方法=GET)。

系统如何验证用户请求并允许他重置密码?

一种替代方法是,使用 flash 属性并将 authenticationKey 设置为 flash 属性……这可以在 resetpassword 方法中进行验证。

有没有其他方法来实现这个......

注意:我在 Post: Spring: How to pass Java objects during redirect while using ModelAttribute中发布了实现此方法的问题

有什么帮助吗?

4

1 回答 1

1

我认为实现这一点的最佳方法是使用三种不同的操作方法:

  • 重置密码(电子邮件)
  • resetLoggedUserPassword(通过设置)
  • 更改默认密码

他们甚至可能拥有相同的观点,但行为并不相同,所以我会避免超载行动责任。

编辑:详细说明您的评论:

1) 要保护电子邮件链接,一种方法是添加身份验证令牌。令牌可以像散列用户 id 加上一些盐字符串一样弱,也可以像数据库表中具有过期时间的 GUID 一样强,每当用户请求重置密码时生成。

2)设置方式没有问题,考虑到用户已经登录。

3) 如果您将用户置于会话中,则可以使用与 1 相同的方式或与 2 相同的方式来保护临时密码操作。如果验证帐户状态的代码位于请求过滤器中,即使使用默认密码状态登录用户也不应该成为问题。

于 2013-08-15T17:10:37.587 回答