图解用户登录验证业务流程(推荐)

简介: 图解用户登录验证业务流程(推荐)
  • 前言
  • 业务图解
  • 流程解读
  • 用户信息设计
  • 验证流程图解
  • 关于token过期时间
  • 关于业务请求token验证
  • 关于登出操作
  • 关于匿名请求(免登录)
  • 方案1:授权token,限制单位时间请求次数
  • 请求次数检查代码实现
  • 方案2:请求路径正则校验
  • 关于黑名单
  • 总结

前言

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

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。

项目地址:https://github.com/YunaiV/ruoyi-vue-pro

业务图解

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

微信图片_20220906164328.png

基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。

项目地址:https://github.com/YunaiV/onemall

流程解读

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

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

服务端-用户验证

  1. 验证账号验证码是否正确
  2. 验证用户是否存在(不存在出初始化用户信息)
  3. 完成验证生成token
  4. 将token返回给客户端

用户信息设计

微信图片_20220906164416.png

验证流程图解

微信图片_20220906164420.png

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

关于token过期时间

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

关于业务请求token验证

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

微信图片_20220906164420.png

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

关于登出操作

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

关于匿名请求(免登录)

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

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

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

技术实现

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

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

微信图片_20220906164548.png

请求次数检查代码实现

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<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就会进行拦截。

总结

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

相关文章
|
算法 网络安全 数据安全/隐私保护
【密码学】手摸手带你手算AES
本文带着大家手动计算了一下完整的简化版AES的整个流程,其实主要都参考了密码学与网络安全这本书,大部分的公式都是从这本书上来的,我是真的喜欢这个例子,麻雀虽小,五脏俱全,用来学习AES的入门感觉非常的合适,如果能够完整的自己手算下来这个例子,然后再去看完整版的AES算法,会简单非常多,主要就是规模扩大了一下,核心的流程还是上面这一套。最后,感谢能看到这里的读者,如果本文对大佬们理解AES有一点点的帮助,也不枉我手动敲了这么多的公式和矩阵了。
1677 0
【密码学】手摸手带你手算AES
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
671 11
|
Linux Perl
Linux命令教程:使用cat命令查看和处理文件
Linux命令教程:使用cat命令查看和处理文件
1765 0
|
存储 安全 开发工具
深入了解云计算架构:从基础到高级
云计算架构是当今信息技术领域中备受瞩目的话题。它已经在商业、科学和日常生活中发挥了巨大作用,为企业提供了灵活性、可扩展性和效率。本文将深入探讨云计算架构的各个方面,从基础概念到高级特性一一介绍。
|
9月前
|
存储 编解码 对象存储
在线教育平台云架构
在线教育平台云架构方案,聚焦万人课堂的高并发、低延迟需求,涵盖视频处理、实时互动、数据存储、安全合规等核心环节。通过CDN加速、弹性扩容、OSS存储、WebRTC互动与全链路安全防护,构建稳定、高效、可扩展的技术体系,支撑“教-学-考”全流程数字化教学,保障大规模在线学习体验流畅与内容安全。(238字)
541 1
|
存储 搜索推荐 安全
销售易CRM:行业深度应用与未来趋势展望
销售易CRM为医疗与教育行业提供智能化解决方案。在医疗领域,它结合数据合规管理与精准营销,助力某医疗器械公司降低40%数据泄露风险、提升35%营销回报率;在教育领域,通过全流程管理和个性化服务,帮助某语言培训机构提高22%学员转化率与18%续费率。未来,销售易CRM将持续创新,推动两行业客户关系管理的智能化发展。
|
弹性计算 监控 大数据
云计算中的弹性伸缩:原理与实践
云计算中的弹性伸缩:原理与实践
1104 99
|
存储 负载均衡 并行计算
Dask性能调优指南:从单机到多节点的最佳配置
【8月更文第29天】Dask 是一个灵活的并行计算库,适用于数组、数据帧和列表等数据结构,能够在单个机器上高效运行,也可以扩展到分布式集群。由于其灵活性和可扩展性,Dask 成为了数据科学家和工程师们处理大规模数据集的理想选择。本文将详细介绍如何针对不同的硬件环境优化 Dask 的性能,包括单机和多节点集群环境。
1890 8
|
存储 缓存 NoSQL
Redis原理—4.核心原理摘要
Redis 是一个基于内存的高性能NoSQL数据库,支持分布式集群和持久化。其网络通信模型采用多路复用监听与文件事件机制,通过单线程串行化处理大量并发请求,确保高效运行。本文主要简单介绍了 Redis 的核心特性。

热门文章

最新文章