我有一个可以在不同场景中调用的弹簧控制器方法。这是一个例子......
@RequestMapping("/resetpassword")
public ModelAndView resetpassword( @Valid @ModelAttribute("resetpasswordForm") ResetPawdFormForm resetPawdFormForm, ModelAndView modelAndView){
......这种方法可以在3种不同的情况下执行....
使用来自用户重置密码链接的超链接发送到用户邮箱.. 例如:localhost / myApp / login / resetpassword // 在这里,我可以在DB中验证userID和activationSecretCode,并让用户重置密码
用户可以从用户设置页面点击resetpassword链接。 例如:由于用户已经来自用户设置页面,我可以验证userSession并允许他重置密码
用户可以第一次成功登录,但由于管理员要求重置初始默认密码,因此被迫重置密码。 例如:在此用户中既没有会话,也没有传递任何激活码来验证。 login方法验证用户ID /默认密码并重定向到resetpassword映射(method = GET)。
系统如何验证用户请求并允许他重置密码?
另一种方法是,使用flash属性并将authenticationKey设置为flash属性...可以在resetpassword方法中验证。
还有其他方法来实现这个....
注意:我在实施此方法时发布了一个问题 发布: Spring:如何在使用ModelAttribute重定向期间传递Java对象
任何帮助?
答案 0 :(得分:0)
我认为实现这一点的最佳方法是使用三种不同的操作方法:
他们甚至可能会分享相同的观点,但行为并不相同,所以我会避免超出行动责任。
编辑:详细说明你的评论:
1)要保护电子邮件链接,一种方法是添加身份验证令牌。令牌可以像散列用户ID一样弱,加上一些盐字符串,或者与用户请求重置密码时生成的数据库表中具有过期时间的GUID一样强。
2)考虑到用户已经登录,设置方式不是问题。
3)如果您将用户置于会话中,则可以采用与1相同的方式保护临时密码操作,或者以与2相同的方式保护临时密码操作。如果验证帐户状态的代码位于请求过滤器内,则即使使用默认密码状态登录用户也不应该担心。