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

【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.

相关推荐
热点推荐
30年前欠的税也要补,上市公司被追缴8500万!各地财政捉襟见肘?

30年前欠的税也要补,上市公司被追缴8500万!各地财政捉襟见肘?

王五说说看
2024-06-14 10:44:45
湖南:小伙捧鲜花表白女技师,做足疗一见钟情,网友:长得很哇塞

湖南:小伙捧鲜花表白女技师,做足疗一见钟情,网友:长得很哇塞

百晓史
2024-06-02 09:09:36
俄向克里米亚部署最先进的S500,阿根廷向乌克兰援助超级军旗

俄向克里米亚部署最先进的S500,阿根廷向乌克兰援助超级军旗

史政先锋
2024-06-13 19:53:16
7000万镑!曼联夏窗首签达成协议,又当冤大头,埃弗顿疯狂宰客!

7000万镑!曼联夏窗首签达成协议,又当冤大头,埃弗顿疯狂宰客!

风过乡
2024-06-14 07:49:19
张学友,确诊了!

张学友,确诊了!

医客
2024-06-14 12:07:59
央视今晚直播,中国女排形势:最多损失15.94分,最多也才4.06分

央视今晚直播,中国女排形势:最多损失15.94分,最多也才4.06分

草根体育
2024-06-14 09:43:19
两名英国人辞去香港终身法院法官职位,这意味着什么?

两名英国人辞去香港终身法院法官职位,这意味着什么?

包明说
2024-06-13 14:45:24
战略负担:俄罗斯正“失去”克里米亚!成为烫手山芋

战略负担:俄罗斯正“失去”克里米亚!成为烫手山芋

项鹏飞
2024-06-12 16:34:13
市民发现一条3米多长蟒蛇,番禺有关部门到场处置,捕捉画面曝光……

市民发现一条3米多长蟒蛇,番禺有关部门到场处置,捕捉画面曝光……

番禺台
2024-06-14 00:07:28
IMF最新评估发现:人民币国际化出现停滞

IMF最新评估发现:人民币国际化出现停滞

长平投研
2024-06-13 22:06:40
若明日绿军取胜 马祖拉将取代莱利成为NBA史上最年轻的冠军教头

若明日绿军取胜 马祖拉将取代莱利成为NBA史上最年轻的冠军教头

直播吧
2024-06-14 11:02:16
40岁陈妍希在潘玮柏婚礼抢风头!穿吊带裙嫩成初恋校花,比新娘美

40岁陈妍希在潘玮柏婚礼抢风头!穿吊带裙嫩成初恋校花,比新娘美

酒盅故事汇
2024-06-13 17:40:00
刚刚,大爆冷!17岁中专女生闯进全球数学竞赛12强,学服装设计的她怎么做到的?

刚刚,大爆冷!17岁中专女生闯进全球数学竞赛12强,学服装设计的她怎么做到的?

都市快报橙柿互动
2024-06-13 14:57:11
湖北省委组织部干部任前公示公告

湖北省委组织部干部任前公示公告

法制社会报
2024-06-14 16:32:31
央媒怒赞、名校开抢!看到“手下败将”履历后,才明白姜萍有多牛

央媒怒赞、名校开抢!看到“手下败将”履历后,才明白姜萍有多牛

时时有聊
2024-06-14 16:00:06
太狗血,37岁前国门私生活曝光,曾诚人设崩塌,300万补偿成空谈

太狗血,37岁前国门私生活曝光,曾诚人设崩塌,300万补偿成空谈

九霄云者
2024-06-14 10:26:31
泽连斯基在德国议院演讲:乌克兰必将以乌克兰条件结束战争!

泽连斯基在德国议院演讲:乌克兰必将以乌克兰条件结束战争!

翻开历史和现实
2024-06-12 10:42:11
恶心,小学生举报学校食堂,学校没有解决实际问题,班级被处分

恶心,小学生举报学校食堂,学校没有解决实际问题,班级被处分

三月柳
2024-06-14 11:21:06
兔子,你不讲武德,为什么叫“吉林一号”的卫星有138颗?

兔子,你不讲武德,为什么叫“吉林一号”的卫星有138颗?

熊孩子爱科技
2024-06-13 22:03:51
全新方案?俄罗斯这个“白日梦”难以实现

全新方案?俄罗斯这个“白日梦”难以实现

深度知局
2024-06-13 17:40:55
2024-06-14 19:22:44
Java精选
Java精选
一场永远也演不完的戏
1551文章数 3855关注度
往期回顾 全部

科技要闻

马斯克重获信任 豪言特斯拉市值超10个苹果

头条要闻

佛山市公安局原副局长被查 曾每月配枪巡逻至少5次

头条要闻

佛山市公安局原副局长被查 曾每月配枪巡逻至少5次

体育要闻

我们为什么还爱欧洲杯?

娱乐要闻

江宏杰秀儿女刺青,不怕刺激福原爱?

财经要闻

央行:5月M1同比降4.2%M2同比增长7%

汽车要闻

提供100/240kW双电机版本车型 乐道L60实车曝光

态度原创

教育
时尚
亲子
数码
军事航空

教育要闻

成外美年一老师押中中考化学最难一题 学生直呼“稳了”!

陈星旭你也太爱晒了吧

亲子要闻

不容易感冒发烧的孩子 免疫力更差?

数码要闻

99元户外神器!Redmi蓝牙音箱首销:5小时续航 还防水

军事要闻

美国与乌克兰签署双边安全协议

无障碍浏览 进入关怀版