图解用户登录验证流程,这下彻底搞懂了!

图解用户登录验证流程,这下彻底搞懂了!

点击加入:
后端技术内卷群,一起学习!

前言

本文通过图示及代码的方式介绍用户登录流程及技术实现,内容包括用户登录,用户验证,如何获取操作用户的信息以及一些黑名单及匿名接口如何免验证相关的实现。

https://juejin.cn/post/7004756545741258765

业务图解

对于用户登录来说、涉及到了用户注册、登录验证几个方面,通过流程图演示如何处理(新用户/老用户)登录

图解用户登录验证流程,这下彻底搞懂了!
流程解读

客户端-登录界面(通常手机验证码登录)

  1. 填写手机号
  2. 发送验证码
  3. 填写验证码
  4. 勾选新用户自动注册

服务端-用户验证

  1. 验证账号验证码是否正确
  2. 验证用户是否存在(不存在出初始化用户信息)
  3. 完成验证生成token
  4. 将token返回给客户端
用户信息设计
图解用户登录验证流程,这下彻底搞懂了!
验证流程图解
图解用户登录验证流程,这下彻底搞懂了!

登录验证流程涉及到了两个接口,两个缓存。

  1. 获取验证码接口,给手机号发送验证码并设置验证码缓存,设置过期时间;
  2. 登录接口,提交手机号及验证码,读取缓存进行匹配验证,成功则生成token返回给客户端,客户端登录成功,登录后请求头携带token进行业务请求即可。
关于token过期时间

通常我们token的过期时间是根据客户端的类型来定义的,app的过期时间会更长一些(通常一个星期),web端过期时间以小时为单位,如果控制过期时间可以将web登录和app登录拆分为两个接口(能够分流,接口压力更小),或者是根据请求头信息进行判断即可,是移动端就设置7天,是web端就设置两小时。

关于业务请求token验证

登录成功后,客户端每次请求都会携带token,通常我们会有一个 网关来进行token验证,网关用于登录验证的核心就是登录成功后写入的token作为key,值为用户基础信息的缓存,图解如下:

图解用户登录验证流程,这下彻底搞懂了!

验证成功后,重写内部请求头,将用户的的id,账号,昵称信息放入请求头中,这样可以方便业务系统获取当前操作用户信息以及权限控制等等

关于登出操作

用户携带token请求登出接口,登出接口对token对应的缓存进行删除操作,返回401即可,客户端获取到401就会跳转到登录页面

关于匿名请求(免登录)

通常匿名请求放行有两种方案,

  1. 授权token,为token设置单位时间内请求次数;
  2. 配置路径放行规则,对请求接口路径进行正则匹配,符合正则规则的进行放行

方案1:授权token,限制单位时间请求次数

优点就是虽然是免登录接口,但是接口的操作对象可以追溯,请求次数可控,避免被非法利用;缺点就是需要更多的编码及配置工作

技术实现

  1. 提供一个授权token管理页面,主要管理token使用者,token的值,单位时间访问次数(如每分钟60次)
  2. 增删改查,将授权token存放到缓存中,使用map进行存储,key为token,值为每分钟访问次数
  3. 单位时间计数缓存,过期时间为1分钟

这时候我们需要在上面的验证流程图基础上进行升级

图解用户登录验证流程,这下彻底搞懂了!

请求次数检查代码实现

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * 授权token请求限制缓存
 */

@Component
public class AuthTokenRequestLimitCache {

    @Autowired
    private RedisTemplate<String, Integer> redisTemplate;

    private static final String AUTH_TOKEN_LIMIT_KEY_PREFIX = "auth_token_limit";

    /**
     * 请求次数+1并检查是否超限
     *
     * @param token
     * @return 是否放行 
     */

    public boolean incrementWithCheck(String token) {
        // 1.获取token请求次数限制,获取为null代表授权配置已被修改,此token已经不具备权限
        Integer limit = getLimit(token);
        if (limit == null) {
            return false;
        }
        // 2.组装缓存key,读取缓存
        String key = String.join(":", AUTH_TOKEN_LIMIT_KEY_PREFIX, token);
        Integer count = redisTemplate.opsForValue().get(key);
        // 3.没有值代表一分钟内没有请求产生了
        if (count == null) {
            // 初始化值
            redisTemplate.opsForValue().increment(key);
            // 设置过期时间
            redisTemplate.expire(key, 1L, TimeUnit.MINUTES);
            return true;
        }
        // 自增并获取当前值 大于限制的话 返回false 网关过滤器返回提示信息(如请求过于频繁)
        Long inc = redisTemplate.opsForValue().increment(key);
        return inc <= limit;
    }

    /**
     * 获取限值
     *
     * @param token
     * @return
     */

    public Integer getLimit(String token) {
        Object limit = redisTemplate.opsForHash().get("auth_token_limit", token);
        return limit == null ? null : (Integer) limit;
    }
}

对于授权接口,通常是只允许get操作,对数据进行提交或者更新是不被允许的,当然这个是业务层面的,最终取决于系统设计

方案2:请求路径正则校验

我们在网关的配置文件中增加匿名接口规则,请求到网关时,检查请求的路径是否符合匿名接口规则,是则放行,不是则进行token校验,方案比较简单,只需要对网关进行处理即可。

关于黑名单

对于一个系统来说,黑名单是最后一道关卡,所以为了安全我们需要对问题用户进行黑名单操作,具体实现也比较简单

  1. 用户管理页面提供一个拉黑的按钮,拉黑后,这些用户的id会存储到一个set集合中去
  2. 登录时候检查用户是否在黑名单中,是则拒绝登录并提示
  3. 如果用户已经登录后进行拉黑操作,网关会在鉴权通过后检查用户是否在黑名单中,是则删除token对应缓存,返回401,401就会跳到登录页,步骤2就会进行拦截。

总结

用户系统是非常基础的系统,但是很多程序员工作中可能并没有真正的参与到用户系统的开发,通过此文可以对用户登录流程及配套功能有一个全面的了解。

原文:juejin.cn/post/7025768845075808286


精彩推荐
最全的java面试题库
开源版的高仿 “ 微信 ”,吊炸天!

与其在网上拼命找题? 不如马上关注我们~

图解用户登录验证流程,这下彻底搞懂了!


↓点阅读原文,Java面试题库尽情看!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/20557.html

(0)
小半的头像小半
0 0

相关推荐

  • 前端如何请求后端数据?有哪些方法可以实现? 前端开发

    前端如何请求后端数据?有哪些方法可以实现?

    0 0172
    李, 若俞的头像 李, 若俞
    2024年4月2日
  • Windows 10 也能安装Kafka?这篇教程让你轻松掌握! 微信精选

    Windows 10 也能安装Kafka?这篇教程让你轻松掌握!

    0 0310
    小半的头像 小半
    2023年10月15日
  • Java 开发,设计先行 微信精选

    Java 开发,设计先行

    0 0165
    小半的头像 小半
    2023年2月16日
  • Java多线程那些事(二) 微信精选

    Java多线程那些事(二)

    0 0118
    小半的头像 小半
    2023年2月2日
  • SpringBoot集成drools 后端开发

    SpringBoot集成drools

    0 0190
    小半的头像 小半
    2022年7月11日
  • SpringBoot多数据源切换就是这么简单 微信精选

    SpringBoot多数据源切换就是这么简单

    0 0261
    小半的头像 小半
    2023年7月21日
  • 模板模式 微信精选

    模板模式

    0 0253
    小半的头像 小半
    2023年1月18日
  • 不割韭菜,纯分享:剖析HTML中的类,运维开发必备前端技能,我们一起坚持。 前端开发

    不割韭菜,纯分享:剖析HTML中的类,运维开发必备前端技能,我们一起坚持。

    0 0193
    小半的头像 小半
    2022年11月25日
  • SpringBoot @Async:魔法和陷阱 Java知音

    SpringBoot @Async:魔法和陷阱

    0 0308
    小半的头像 小半
    2023年11月5日
  • 19. Django 2.1.7 模型的关联 Python

    19. Django 2.1.7 模型的关联

    0 0251
    小半的头像 小半
    2022年9月25日
  • SpringBoot 监控神器——Actuator 保姆级教程 Java知音

    SpringBoot 监控神器——Actuator 保姆级教程

    0 0245
    小半的头像 小半
    2023年6月18日
  • Redis实现微博好友功能微服务(关注,取关,共同关注) Java知音

    Redis实现微博好友功能微服务(关注,取关,共同关注)

    0 0298
    小半的头像 小半
    2022年12月26日

发表回复

登录后才能评论

扫我!扫我!扫码!

图解用户登录验证流程,这下彻底搞懂了!

站长精选

  • 这款 IDEA 插件太好用了,堪称日志管理神器!

    这款 IDEA 插件太好用了,堪称日志管理神器!

    2023年3月13日

  • 【SpringBoot】 Test & Junit5 看这一篇就足够了

    【SpringBoot】 Test & Junit5 看这一篇就足够了

    2024年7月17日

  • Redis:分别从互斥锁与逻辑过期两个方面来解决缓存击穿问题

    Redis:分别从互斥锁与逻辑过期两个方面来解决缓存击穿问题

    2023年8月1日

  • 高颜值的一站式开源的数据中台

    高颜值的一站式开源的数据中台

    2024年1月3日

  • 一款 IntelliJ IDEA 神级插件,由 ChatGPT 团队开发,堪称辅助神器!

    一款 IntelliJ IDEA 神级插件,由 ChatGPT 团队开发,堪称辅助神器!

    2023年4月25日

  • 为什么建议你替换掉 SpringBoot 框架中的 Tomcat ?

    为什么建议你替换掉 SpringBoot 框架中的 Tomcat ?

    2023年1月5日

  • 用 Linux,不会用 Vim,你是认真的吗?

    用 Linux,不会用 Vim,你是认真的吗?

    2024年9月18日

  • 分布式定时调度:xxl-job 最佳实践

    分布式定时调度:xxl-job 最佳实践

    2023年11月27日

  • Mybatis模糊查询:三种定义参数方法和聚合查询、主键回填

    Mybatis模糊查询:三种定义参数方法和聚合查询、主键回填

    2023年4月10日

  • 容器集群的日志要如何治理?

    容器集群的日志要如何治理?

    2023年11月21日

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!

深圳坪山网站建设公司惠东网站优化价格网站排名优化哪家价格便宜德阳科技企业网站优化安阳网站快照优化企业网站优化哪家好公司百度怎么优化网站关键词排名怎么做网站排名优化沁阳网站优化推广哪家有实力给一个网站哪些方式进行优化优化网站收费廊坊网站优化收费望江网站优化哪家价格实惠河北网站优化程度安徽网站优化选哪家蜘蛛屯河南网站排名优化册亨网站优化价格微博优化网站推广优化网站排名一流火4星完美商丘网站推广优化推荐SEO优化专员网站优化招聘如何优化网站了解易速达马鞍山市网站优化哪家服务好建筑行业网站优化营销广西娄底网站优化网站优化怎么作开封搜索引擎网站优化费用福田中小型网站优化在线推广手机网站seo关键词优化临湘优化网站临沧网站优化策略香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化