图解用户登录验证流程,写得太好了!(实现用户登录验证的原理)

  本篇文章为你整理了图解用户登录验证流程,写得太好了!(实现用户登录验证的原理)的详细内容,包含有用户登录验证程序 实现用户登录验证的原理 登录验证的几种方式 登录验证是什么的功能 图解用户登录验证流程,写得太好了!,希望能帮助你了解 图解用户登录验证流程,写得太好了!。

  分享Java技术,高并发编程,分布式技术,架构设计,Java面试题,算法,行业动态,程序人生等。

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

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

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

  填写手机号

  发送验证码

  填写验证码

  勾选新用户自动注册

  服务端-用户验证

  验证账号验证码是否正确

  验证用户是否存在(不存在出初始化用户信息)

  完成验证生成token

  将token返回给客户端

  用户信息设计

  验证流程图解

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

  获取验证码接口,给手机号发送验证码并设置验证码缓存,设置过期时间;

  登录接口,提交手机号及验证码,读取缓存进行匹配验证,成功则生成token返回给客户端,客户端登录成功,登录后请求头携带token进行业务请求即可。

  关于token过期时间

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

  关于业务请求token验证

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

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

  关于登出操作

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

  关于匿名请求(免登录)

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

  授权token,为token设置单位时间内请求次数;

  配置路径放行规则,对请求接口路径进行正则匹配,符合正则规则的进行放行

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

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

  提供一个授权token管理页面,主要管理token使用者,token的值,单位时间访问次数(如每分钟60次)

  增删改查,将授权token存放到缓存中,使用map进行存储,key为token,值为每分钟访问次数

  单位时间计数缓存,过期时间为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校验,方案比较简单,只需要对网关进行处理即可。

  关于黑名单

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

  用户管理页面提供一个拉黑的按钮,拉黑后,这些用户的id会存储到一个set集合中去

  登录时候检查用户是否在黑名单中,是则拒绝登录并提示

  如果用户已经登录后进行拉黑操作,网关会在鉴权通过后检查用户是否在黑名单中,是则删除token对应缓存,返回401,401就会跳到登录页,步骤2就会进行拦截。

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

  近期热文推荐:

  1.1,000+ 道 Java面试题及答案整理(2022最新版)

  2.劲爆!Java 协程要来了。。。

  3.Spring Boot 2.x 教程,太全了!

  4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

  5.《Java开发手册(嵩山版)》最新发布,速速下载!

  觉得不错,别忘了随手点赞+转发哦!

  以上就是图解用户登录验证流程,写得太好了!(实现用户登录验证的原理)的详细内容,想要了解更多 图解用户登录验证流程,写得太好了!的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: