👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,双非大四,春招努力找工作中…”);
📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”);
🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三连支持一下博主噢🔥”);
🌈System.out.println("🚀正在完成计划中:努力找工作 ");
背景
在之前实习的时候,客户要求实现双因素登录,当时的具体思路在这里回忆一下。项目的整个体系都是基于SpringSecurity框架进行实现的认证,所以思路也可能有一些局限性
实现思路
双因素身份验证是指用户提供除用户名和密码之外的第二种形式的身份验证来增加额外的安全层。
思路一:用户名和密码认证通过后,再进行验证码认证,认证通过后返回token给客户
- 有漏洞,如果直接调用接口验证码登录,可能导致第一因素失效无作用
@Component
public class CustomAuthenticationFilter extends OncePerRequestFilter {
@Autowired
private AuthenticationManager manager;
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
String username = httpServletRequest.getHeader("username");
String password = httpServletRequest.getHeader("password");
String sms = httpServletRequest.getHeader("sms");
if (sms == null) {
// 第一因素:账号密码验证
Authentication a = new UsernamePasswordAuthentication(username, password);
manager.authenticate(a);
} else {
// 第二因素:手机号验证码验证或者其他
Authentication a = new SMSAuthentication(username, sms);
manager.authenticate(a);
// 第二因素认证通过,说明认证成功,向用户发放令牌或者是其它
//....
}
}
@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
return !request.getServletPath().equals("/login");
}
}
思路二:用户名和密码认证通过后,生成非认证token;非认证token+短信验证码再次认证通过后,生成认证token返回给客户,即登录成功
思路三(推荐):用户名和密码认证通过后,在成功方法successfulAuthentication中判断是否开启了双因素认证,如果开启了,将用户信息先缓存,然后在响应头中添加标识给前端,让前端再去调用对应的接口,进行下一步的认证(totp验证码、短信验证码等等),认证成功后返回token
- 思路三也是最终的实现方案
最后
慢慢的来,别着急!学会有质量的走过每一步
我是代码不会敲的小符,希望认识更多有经验的大佬,也在努力摸索出自己的道路
欢迎添加小符微信:A13781678921,一起加油
791

被折叠的 条评论
为什么被折叠?



