我试图在Spring应用程序中实现双因素身份验证。
期望的情况
我希望用户首先使用他的用户名和密码登录,如果这些是正确的,我希望系统生成随机密钥并通过电子邮件发送给用户。之后,系统必须将用户重定向到他只需输入令牌并登录系统的页面。
到目前为止(伪代码)
用户进入login.jsp页面。使用用户名/密码登录后,系统会发出CustomMade AuthenticationException。在AuthenticationFailureHandler中,我对异常执行了getAuthentication(我意识到了折旧)但我使用用户名向用户发送了他的令牌。之后,我将异常放入会话中(使用request.getSession()。setAttribute),最后系统重新加载login.jsp。
Login.jsp在会话中看到异常并显示令牌输入字段。用户填写令牌输入字段并登录。系统使用会话中的凭据和给定令牌对用户进行身份验证。
问题
我认为在会话中保存用户名/密码是不好的做法。我想到的两种可能的解决方案:
检查用户名/密码后。将用户名保存在静态变量或DB中。当用户输入令牌时,检查用户名是否在变量/ db中并检查令牌。如果令牌是正确的,请与用户一起登录。
检查用户名/密码后,以低角色登录用户。由于角色较低,用户只能进入令牌页面,在输入有效令牌后,系统会为用户提供新的权限。
实施的最佳解决方案是什么?