双因素登录实现思路

👽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,一起加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码不会敲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值