原文:juejin.cn/post/7025768845075808286前言本文通过图解和代码的方式介绍了用户登录流程和技术实现,包括用户登录、用户验证、如何获取操作用户信息,以及一些黑名单和匿名接口如何实现以避免与验证相关的实现。对于用户登录,业务图涉及到用户注册、登录验证等几个方面。该流程图演示了如何处理(新用户/旧用户)登录过程。解释说明客户端-登录界面(一般为手机验证码登录)填写手机号码发送验证码填写验证码查看新用户自动注册服务器端-用户验证验证账号验证码是否正确验证是否正确用户存在(初始化的用户信息不存在)完成验证生成token,返回token给客户端用户信息设计验证流程图形化登录验证流程涉及两个接口,两个缓存。获取验证码接口,将验证码发送到手机号,设置验证码缓存,设置过期时间;登录界面,提交手机号和验证码,读取缓存进行匹配验证,如果成功则生成token返回给客户端,客户端登录成功,登录后请求头携带发出业务请求的令牌。关于token过期时间,我们token的过期时间通常是根据客户端的类型来定义的。app的过期时间会长一些(一般为一周),web端的过期时间以小时为单位。如果控制过期时间,可以将web登录和app登录拆分成两个接口(可以拆分,接口压力小),也可以根据请求头信息判断。移动端设置为7天,网页端设置为2小时。关于业务请求token验证登录成功后,客户端每次请求都会携带token。通常我们会有一个网关来进行token验证。登录验证网关的核心是登录成功后写入的token为key,value为用户。基本信息缓存说明如下:验证成功后,重写内部请求头,将用户的id、账号、昵称信息放入请求头中,方便业务系统获取当前操作用户信息和权限控制等。关于注销操作用户携带令牌请求注销接口。注销接口删除token对应的缓存,返回401,客户端得到401后会跳转到登录页面。每单位时间对令牌的请求数;配置路径释放规则,对请求接口路径进行正则匹配,满足正则规则的释放。方案一:授权token,限制单位时间内的请求次数。优点是虽然是免登录界面,但界面操作对象可追溯,控制请求次数,避免非法使用;缺点是需要更多的编码和配置工作技术来提供一个授权token管理页面,主要管理token的用户,token的值,单位时间内访问次数(比如每分钟60次)的增删改查,修改并检查,授权令牌存储在缓存中,并使用映射存储。key是token,value是单位时间内每分钟的访问次数。对缓存进行统计,过期时间为1分钟这时候我们需要在上面验证流程图的基础上查看升级请求的次数,实现importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.stereotype.Component;importjava.util.concurrent.TimeUnit;/***授权令牌请求限制缓存*/@ComponentpublicclassAuthTokenRequestLimitCache{@AutowiredprivateRedisTemplate<字符串,整数>redisTemplate;私有静态最终字符串AUTH_TOKEN_LIMIT_KEY_PREFIX="auth_token_limit";/***请求次数+1,检查是否超过限制**@paramtoken*@return是否释放*/publicbooleanincrementWithCheck(Stringtoken){//1.获取token请求限制,如果是则获取为null,表示修改了授权配置,此token不再有权限Integerlimit=getLimit(token);如果(限制==空){返回假;}//2.组装缓存键并读取缓存Stringkey=String.join(":",AUTH_TOKEN_LIMIT_KEY_PREFIX,token);整数计数=redisTemplate.opsForValue().get(key);//3.没有值表示一分钟内没有请求产生if(count==null){//初始化值redisTemplate.opsForValue().increment(key);//设置过期时间redisTemplate.expire(key,1L,TimeUnit.MINUTES);返回真;}//自增获取当前值大于限制,返回false网关过滤服务器返回提示信息(如果请求太频繁)Longinc=redisTemplate.opsForValue().increment(key);返回公司<=限制;}/***获取限制值**@paramtoken*@return*/publicIntegergetLimit(Stringtoken){Objectlimit=redisTemplate.opsForHash().get("auth_token_limit",token);返回限制==null?null:(整数)限制;}}对于授权接口,通常是只允许get操作,不允许数据提交或更新。当然这是业务层面的,最终还是要看系统设计方案2:请求路径正则性验证我们在网关配置文件中加入匿名接口规则,请求到达网关时,检查请求的路径是否符合与匿名接口的规则。如果是,它将被释放;一个检查点,所以为了安全我们需要将有问题的用户列入黑名单,具体实现比较简单。用户管理页面提供黑名单按钮。加入黑名单后,这些用户的id会存储在一个集合中,登录时查看。用户是否在黑名单中,如果是,则拒绝登录并提示用户是否已经登录并进行黑名单操作,网关在认证通过后会检查用户是否在黑名单中,如果是,则删除token对应的缓存,并返回401,401会跳转到登录页面,第2步会被拦截。总结用户系统是一个非常基础的系统,但是很多程序员在工作中可能并没有真正参与到用户系统的开发中。通过本文,您可以全面了解用户登录流程及配套功能。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!