一文搞懂用户登录验证流程(附图)

这篇具有很好参考价值的文章主要介绍了一文搞懂用户登录验证流程(附图)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

结合网关相关知识食用更佳

业务图解

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

一文搞懂用户登录验证流程(附图)

流程解读

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

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

  • 服务端-用户验证

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

用户信息设计

字段 描述 类型 是否唯一
telephone 手机号 varchar
nickname 昵称 varchar 根据业务决定是否可重复
account 账号 varchar
password 密码 varchar
create_time 创建时间 datetime
modify_time 修改时间 datetime
...省略小程序授权码等等、根据自身业务进行增加

验证流程图解

一文搞懂用户登录验证流程(附图)

登录验证流程涉及到了两个接口,两个缓存。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
    */@Componentpublic class AuthTokenRequestLimitCache {

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

总结

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

其它登录鉴权相关文章

阿里需求挑战-十分钟内连续登录5次失败,需要等待30分钟才能登录【附图】 - 掘金 (juejin.cn)

快速搭建一个网关服务,动态路由、鉴权看完就会(含流程图) - 掘金 (juejin.cn)文章来源地址https://www.toymoban.com/news/detail-430497.html

来源:https://juejin.cn/post/7025768845075808286

到了这里,关于一文搞懂用户登录验证流程(附图)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django用户登录验证和自定义验证类

    用户登录时,使用 authenticate 验证用户名和密码是否正确,正确则返回一个用户对象。 用户名默认的字段名是 username 密码默认的字段名是 password 将已验证的用户添加到当前会话(session)中,可使用 login() 函数完成。 注意,如果用户未登录,logout() 不会报错。 调用 logout() 后,

    2024年02月14日
    浏览(40)
  • SAP安全 - 用户身份验证和单点登录

    单点登录(SSO) 是允许您登录到一个系统的关键概念之一,您可以在后端访问多个系统. SSO允许用户通过后端的SAP系统访问软件资源. 使用NetWeaver的SSO  平台提供用户身份验证并帮助系统管理员管理用户在复杂的SAP系统架构中加载. SSO配置通过增强安全措施并减少多个系统的密码

    2024年02月04日
    浏览(40)
  • IDEA Android用户登录页面、登录验证、页面跳转演示示例全部源码

    开发工具: IDEA 2022.3.2,未连接数据库。验证用的用户名和密码为内置硬编码 演示程序运行效果:     设计器中的用户登录页面布局:  登录验证容错提示如下: 1,用户名不能为空: 2,密码不能为空:     3,用户名不存在: 4,用户密码错误    5,登录验证成功跳转到用户

    2024年02月11日
    浏览(49)
  • Spring boot框架 JWT实现用户账户密码登录验证

    目录 1、JWT定义 1、1 JWT工作流程 1、2 JWT优点 2、添加依赖项到pom.xml  3、创建用户实体类  4、实现认证服务 5、登录请求处理 6、生成JWT JWT(JSON Web Token)是一种用于在网络应用间传递信息的安全传输方式。它是一种紧凑且自包含的方式,通过使用数字签名来验证数据的完整性

    2024年02月07日
    浏览(59)
  • Java--用户登录/注册界面(连接Mysql数据库)并可以通过验证码登录

    1 效果展示 (1)登录界面 (2)注册界面 (3)动图展示 2 内容说明 (1)开发前,需引入一个连接Mysql 数据库驱动mysql-connector-java-5.1.30-bin.jar包 提取码:6666 (2)构建路径 (3)需要下载xampp软件 xampp软件下载 提取码:2255 xampp软件包含 Apache Web服务器、 Mysql Web服务器、Filezilla

    2024年02月09日
    浏览(60)
  • 【Spring Boot】社交网站中验证用户登录的checkUser方法

    这段代码是UserService类中的checkUser方法,用于验证用户登录。具体解释如下: 方法签名:public boolean checkUser(User user) 参数:User user,表示用户实体对象,包含用户名和密码 返回值:boolean类型,表示验证结果,true表示验证通过,false表示验证失败 逻辑:首先根据用户输入的用

    2024年02月11日
    浏览(41)
  • Web实战丨基于Django与HTML的用户登录验证系统

    本期内容:基于Django与HTML的简单登录验证系统。 项目需求:Python+Django 项目下载地址:https://download.csdn.net/download/m0_68111267/88727183 登录系统在我们的日常生活中随处可见,比如当我们使用QQ、微信等社交软件时,都需要先输入自己的账号密码进行登录,本文博主将带着大家用

    2024年01月25日
    浏览(50)
  • 微信小程序登录页验证与页面跳转(二) ---结合SpringBoot和MySQL实现多用户登录

    Spring Boot的开发环境如下: 1、IDEA:2020 2、JDK版本:1.8 3、MySQL 版本:8 代码如下(示例): 打开IDEA,新建项目: 这里选择Spring lnitializr: 在接下来的页面中进行如下配置: 进行下一步:选择SpringBoot的版本,这里选择的是2.7.14 然后: 设置项目所在路径和设置项目名称: 项

    2024年01月22日
    浏览(58)
  • 阿里云新用户滑块验证不过,阿里云滑动验证流程及线上问题排查

    滑动验证是阿里巴巴集团提供的一种验证码解决方案,采用风险分析引擎,有效区分来自人类与机器人的访问行为并拦截机器风险,为您提供安全可靠的业务环境。 下图是滑动验证在用户客户端的展示效果。 产品介绍:阿里云验证码(Alibaba Captcha) 滑动验证流程 滑动验证服

    2024年01月17日
    浏览(41)
  • 南京邮电大学汇编语言程序设计实验二(用户登录验证程序的设计)

    1.掌握循环程序的编写以及结束循环的方法。 2.掌握DOS、BIOS功能调用的使用方法。 用户登录验证程序的实现 程序执行后,给出提示操作,请用户键入用户名和密码;用户在键入密码时,程序不回显键入字符;只有当用户键入的用户名,密码字符串和程序内定的字符串相同时

    2023年04月18日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包