网易首页 > 网易号 > 正文 申请入驻

【209期】图解用户登录验证业务流程(面试应答推荐)

0
分享至

点击上方“Java精选”,选择“设为星标”

别问别人为什么,多问自己凭什么!

下方有惊喜,留言必回,有问必答!

每天08:15更新文章,每天进步一点点...


前言

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

结合昨天的网关相关知识食用更佳

业务图解

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

流程解读

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

  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请求限制缓存
*
* @author 热黄油啤酒
* @since 2021-11-01
*/
@Component
public class AuthTokenRequestLimitCache {

@Autowired
private RedisTemplate 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就会进行拦截。

总结

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

作者:热黄油啤酒 https://juejin.cn/post/7004756545741258765

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

------ THE END ------

精品资料,超赞福利!


3000+ 道面试题在线刷,最新、最全 Java 面试题!

期往精选 点击标题可跳转

技术交流群!

最近有很多人问,有没有读者&异性交流群,你懂的!想知道如何加入。加入方式很简单,有兴趣的同学,只需要点击下方卡片,回复“加群”,即可免费加入交流群!

文章有帮助的话,在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
朝鲜女特工:我吃得比高干好,教官要我有随时与外国人结婚的觉悟

朝鲜女特工:我吃得比高干好,教官要我有随时与外国人结婚的觉悟

掠影后有感
2026-08-16 10:05:56
儿子被密春雷拖累风波后,董卿又迎新噩耗,这次网友风评罕见一致

儿子被密春雷拖累风波后,董卿又迎新噩耗,这次网友风评罕见一致

世界更加宽广
2026-08-16 11:00:04
让中年女人“多巴胺”飙升的,不是接吻,而是这3样东西!

让中年女人“多巴胺”飙升的,不是接吻,而是这3样东西!

艺鉴在线
2026-08-17 07:03:43
戴笠身边人晚年坦言:他当年安顿胡蝶时,仅因瞥见她旗袍下摆一处褶皱,竟立刻命人腾出小院

戴笠身边人晚年坦言:他当年安顿胡蝶时,仅因瞥见她旗袍下摆一处褶皱,竟立刻命人腾出小院

磊子讲史
2026-08-15 17:48:13
赖清德副手谈统一,郑丽文、蒋万安、卢秀燕火力全开,韩国瑜沉默

赖清德副手谈统一,郑丽文、蒋万安、卢秀燕火力全开,韩国瑜沉默

鹤羽说个事
2026-08-16 19:29:37
曾带张本宇赴日的何智丽,如今61岁独居大阪,想回上海养老

曾带张本宇赴日的何智丽,如今61岁独居大阪,想回上海养老

孤城落日
2026-08-13 16:15:34
“接不到戏,收入基本断了”,38岁演员求职景区NPC:工作量断崖式下跌,留给我试错的时间不多了

“接不到戏,收入基本断了”,38岁演员求职景区NPC:工作量断崖式下跌,留给我试错的时间不多了

广州生活美食圈
2026-08-14 11:49:58
中方劈头盖脸,让菲律宾防长回话:谁指使你对中国人下狠手的?

中方劈头盖脸,让菲律宾防长回话:谁指使你对中国人下狠手的?

知法而形
2026-08-17 05:39:13
看完王曼昱4‑0横扫蒯曼!不得不承认5个事实,女单强势会师!

看完王曼昱4‑0横扫蒯曼!不得不承认5个事实,女单强势会师!

田先生篮球
2026-08-16 20:49:24
欧洲大满贯 王曼昱女单夺冠 王艺迪国乒功臣 男单新冠产生

欧洲大满贯 王曼昱女单夺冠 王艺迪国乒功臣 男单新冠产生

江启
2026-08-17 07:54:44
英媒曝光俄绝密文件:一旦俄与北约开战,普京先打中国的两个邻国

英媒曝光俄绝密文件:一旦俄与北约开战,普京先打中国的两个邻国

马贪在解说
2026-08-14 05:31:33
深夜,歹徒闯入家中对她施暴近两个小时,她咬紧牙关一声不吭,只为保护楼上熟睡的女儿。当警察破门而入时,才发现这位母亲早已浑身是血

深夜,歹徒闯入家中对她施暴近两个小时,她咬紧牙关一声不吭,只为保护楼上熟睡的女儿。当警察破门而入时,才发现这位母亲早已浑身是血

人生录
2026-07-30 00:05:11
8月红果榜单出炉 AI漫剧抢了真人短剧的饭碗?榜首1.07亿无人超越

8月红果榜单出炉 AI漫剧抢了真人短剧的饭碗?榜首1.07亿无人超越

可乐谈情感
2026-08-16 11:36:04
万亿资产归零,全国第四大保险集团破产,1.5万亿保单怎么样了?

万亿资产归零,全国第四大保险集团破产,1.5万亿保单怎么样了?

张鼋卤说体育
2026-08-16 23:35:08
“这种地方,我女儿要住3年!”高中住宿环境,让家长当场破防

“这种地方,我女儿要住3年!”高中住宿环境,让家长当场破防

妍妍教育日记
2026-08-14 15:02:56
美国卫生部长儿子加入乌克兰志愿军团

美国卫生部长儿子加入乌克兰志愿军团

鸿雁复北翔热评
2026-08-15 20:53:31
大批网贷集体退场,欠下债务的普通人,该何去何从?

大批网贷集体退场,欠下债务的普通人,该何去何从?

侃故事的阿庆
2026-08-17 04:05:56
俄军不按套路出牌?一夜之间,乌7州变天,乌军偷拍视频越看越不对劲

俄军不按套路出牌?一夜之间,乌7州变天,乌军偷拍视频越看越不对劲

浯江孤舟
2026-08-15 10:32:25
210亿美元,黄仁勋投了马斯克

210亿美元,黄仁勋投了马斯克

21世纪经济报道
2026-08-16 07:28:37
跟一位华为老员工聊天,他说:珍惜正式员工身份吧,未来变得像“奢侈品”一样

跟一位华为老员工聊天,他说:珍惜正式员工身份吧,未来变得像“奢侈品”一样

蚂蚁大喇叭
2026-08-15 17:13:29
2026-08-17 08:20:49
Java精选
Java精选
一场永远也演不完的戏
1799文章数 3859关注度
往期回顾 全部

科技要闻

210亿美元,黄仁勋投了马斯克

头条要闻

高市早苗"遥拜"靖国神社细节公开 遭日本在野党痛斥

头条要闻

高市早苗"遥拜"靖国神社细节公开 遭日本在野党痛斥

体育要闻

因莫比莱:普通人的平凡故事

娱乐要闻

谷爱凌发文否认恋情:“散了散了”

财经要闻

事关8万亿养老金!长周期考核落地中

汽车要闻

杨洋成001号车主 岚图追光S正式上市

态度原创

时尚
游戏
艺术
数码
教育

不再执着于“孔乙己的长衫”?年青一代正在成为“新蓝领”

《影之刃零》幕后消息 甄子丹亲手优化护婴打戏

艺术要闻

看看康生真迹,才知什么叫“眼高于顶”

数码要闻

苹果智能家居产品路线图曝光 多款新品计划2026年推出

教育要闻

找规律,62,63,64,65,66,(),答案不是67

无障碍浏览 进入关怀版