实现一个登录功能方案设计2

news/2024/9/17 19:06:56/

  • 需求
  • MySQL表
  • 实现方案
    • index页面
    • home页面

需求

实现一个登录功能

实现的功能

  1. 注册(邮箱注册)
  2. 登录(邮箱+密码)
  3. 重置密码
  4. 查看操作记录(登录, 注册, 重置密码, 登出. 都算操作)
  5. 登出

在第一版的基础上进行优化:\

优化点:

  1. 存操作信息

请求的post使用中间件进行储存操作信息.避免重复代码
因为除了查询操作不需要存入 OperationRecord(操作列表)外,其他操作都要存入操作列表,当用户提交注册,登录,重置密码,登出等操作时就将用户的操作信息存入OperationRecord(操作列表)中,避免重复代码.

  1. 验证码:

(1)验证码的储存:

为了数据安全,必须严格核验验证码的准确性,所以验证码不能单独生成,必须与申请验证码信息的账号相关,通过账号储存验证码信息,在核验的时候也不能单独核验,上传验证码的账号必须与生成验证码的账号相同,避免在提交验证码时用户恶意篡改邮箱信息.

  • 验证码储存:存map["Email"]验证码(int),再定义一个删除时间,在核验的时候需要key与value都相同
  • 或者存MySQL
名称数据类型
Emailstring
验证码int

核验的时候也使用Email查询验证码核验,到一定时间删除MySQL数据

(2)验证码时效

验证码生成后设计5分钟内验证码未使用就从列表中删除了,5分钟后用户填写验证码即为无效验证,需要重新获取验证码,但是如果申请验证码的用户未进行任何验证,错误与正确验证都没有,那么重新发送的验证码将与原验证码相同,否则发送的验证码将与原验证码不同.避免某些用户在5分钟内没法收到验证码的情况.

(3)操作与验证分离式

  • 用到验证码只有登录 ,改密与注册,可以进行先获取权限,后执行操作(先验证邮箱,锁定邮箱,避免验证后用户又进行更改,再改密或者注册就只能是刚刚注册的邮箱)

(一). 邮箱验证(先)

名称数据类型
Emailstring
验证码int

(二). 注册/改密(后)(登录没有后续操作)

改密

新密码string
againstring

注册

namestring
密码string
  1. id主键

主键自增:

用自增长整数代替随机数避免重复:使用整数作为主键,每插入一条新记录,主键自动加一。这种方式不会产生重复的主键,而且速度快,但无法在分布式环境下使用。

  1. 真人验证:

为避免机器人攻击网站,恶意刷邮件等操作,在登录,改密,注册等关键性节点加上真人验证环节.

我们选择

滑动验证:滑块验证是一种常见的验证方法,要求用户在滑块上进行拖动操作,以证明他们是真人而不是机器人。这种验证方法通常易于使用,因为它不需要用户输入文本或解决问题,但仍然可以提供相对高的安全性。

  1. 保持登录状态

由于服务器与用户的数据交互不是连续的,我们只能从SignInList(登录列表)判断用户是否在线,无法判断用户是否掉线,所以我们给SignInList(登录列表)中的数据增加一个时效(30分钟),如果30分钟之内用户无任何操作则视为掉线,服务端将删除SignInList(登录列表)中对应用户的数据,当用户30分钟后再次访问时就需要重新登陆.如果在30分钟之内用户有操作,则重新计算30分钟时间(从0开始).

MySQL表

  1. LoginList(注册列表)
名称数据类型
id(主键)int
name(唯一)string
passwordstring
Email(唯一)string
  1. SignInList(登录列表)
名称数据类型
id (主键)int
身份码int
  1. OperationRecord(操作列表)
名称数据类型
idint
操作string
timestring
  1. VerificationCode(验证码储存库)
名称数据类型
Email(唯一)string
Verificationint

实现方案

index页面

/index

定义一个index页面包含两个按钮login(注册)和sign up(登录) 点击login进入注册页面,点击sign up进入登录页面

login(注册)

index/login

(1). 注册邮箱验证:

  1. 用户先填写注册邮箱(核验邮箱格式正确且未使用),点击发送验证码
  2. 弹出真人验证:滑动验证
  3. 生成验证码,与Email一起储存在VerificationCode(验证码储存库),并设计5分钟的删除时间,如果5分钟未验证,便该删除数据.
  4. 向用户邮箱发送验证码
  5. 重新提交,如果验证码生成后,该用户未进行任何验证,则生成相同的验证码,并告知用户,如果之前有验证失败,就生成不同的验证码.避免某些用户在5分钟内没法收到验证码的情况.
  6. 服务端使用用户的提交验证码时的Email去VerificationCode(验证码储存库)对比相对应的Verification(验证码值),进行验证.
  7. 如果5分钟内都没有验证成功,就删除VerificationCode(验证码储存库)的对应数据,用户再次提交时生成新的验证码
  8. 如果发送验证码的用户30分钟内未进行任何验证,点击重新发送验证码,则生成与之前相同的验证码,避免某些用户在5分钟内没法收到验证码的情况.

(2)注册:

注册表单:

名称数据类型
namestring
passwordstring
  1. 先验证name是否有效与是否被使用(例如:name不能超过10个字符且字符都在ASCII中)

  2. 核验password是否规范(例如:大于6位小于20位) 确认没问题后

  3. 将用户数据(注册的Email,name,password)储存到LoginList(注册列表),并自增出一个新的ID

(5)通过id向OperationRecord(操作列表)中储存 "注册" 操作与目前的时间

alt

sign up(登录)

index/signup

  1. 邮箱密码登录

账号密码登录表单:

名称数据类型
Emailstring
passwordstring

(1). 用户填写表单信息,点击登录.

(2). 弹出真人验证:滑动验证

(3). 向服务端发送表单数据,服务端拿到表单数据去MySQL中查找,如果找不到对应的Email返回该邮箱未注册,请先注册,如果password错误返回密码错误,

(4). 核验成功,服务端随机生成一个临时的访问身份码,与id一起储存到MySQL中的SignInList(登录列表)中(时效30分钟,30分钟后删除),再将一份发送给用户,用户拿着此身份码进入home页面

(5). 通过id向OperationRecord(操作列表)中储存 "登录" 操作与目前的时间

  1. 验证码登录

验证码登录表单:

名称数据类型
Emailstring
验证码int

(1). 用户填写Email,点击发送验证码,

(2). 弹出真人验证:滑动验证

(3). 向服务端发送Email数据,服务端拿到数据去MySQL中查找,如果找不到对应的Email返回该邮箱未注册,请先注册,如果存在就向邮箱发送一封验证邮件

(4). 用户填写验证邮件,点击登录,服务器会核验验证码的正确性,核验成功,服务端随机生成一个临时的访问身份码,与id一起储存到MySQL中的SignInList(登录列表)中,再将一份发送给用户,用户拿着此身份码进入home页面

(5)通过id向OperationRecord(操作列表)中储存 "登录" 操作与目前的时间

用户登出或者意外掉线,服务端会删除SignInList(登录列表)中Email对应的数据.

原理图

alt

home页面

/home

  • 定义三个按钮 sign out(登出),reset password(重置密码),view(查看操作记录)

sign out(登出)

home/signout

  1. 通过用户的Email,删除SignInList(登录列表)对应的数据.
  2. 回到index页面

(3)通过id向OperationRecord(操作列表)中储存 "登出" 操作与目前的时间

alt

reset password(重置密码)

home/resetpassword 两个按钮:旧密码改密|验证码改密

1. 旧密码密码改密

(1). 验证正常登录状态:(核验身份) 检验目前用户的id与身份码信息是否在MySQL中SignInList(登录列表)存在且正确,重置数据时效,(重置为30分钟,30分钟后删除)

  • 核验身份失败,退回到index页面

旧密码改密表单:

名称数据类型
passwordstring
new passwordstring
new password againstring

(2). 用户填写表单信息,点击提交.

(3). 弹出真人验证:滑动验证

(4). 向服务端发送表单数据,服务端拿到表单数据核验new password是否规范(例如:大于6位小于20位),

(5). 检验password again密码是否相同

(6). 核验成功,服务端修改MySQL中的 LoginList(注册列表)中对应的id下的password

(7)通过id向OperationRecord(操作列表)中储存 "改密" 操作与目前的时间

2. 验证码改密

(1). 验证正常登录状态:(核验身份) 检验目前用户的id与身份码信息是否在MySQL中SignInList(登录列表)存在且正确,重置数据时效,(重置为30分钟,30分钟后删除)

  • 核验身份失败,退回到index页面

验证码改密表单:

名称数据类型
验证码int

(1). 用户点击发送验证码,

(2). 弹出真人验证:滑动验证

(3). 服务器通过用户的id获取用户的Email信息,向Email发送一封验证邮件

(4). 用户点击提交,服务端核验验证码正确性(核验失败返回验证码错误),核验成功:修改MySQL中的 LoginList(注册列表)中对应的用户的id的password;

(5)通过id向OperationRecord(操作列表)中储存 "改密" 操作与目前的时间

alt

查询操作记录

  1. 身份核验:
    检验目前用户的id与身份码信息是否在MySQL中SignInList(登录列表)存在且正确,重置数据时效,(重置为30分钟,30分钟后删除)

  2. 核验无误,服务端查询OperationRecord(操作列表)中的所有id为用户id的数据,并返回给用户

alt

本文由 mdnice 多平台发布


http://www.ppmy.cn/news/44883.html

相关文章

门面设计模式

目录 前言: 门面模式的原理与实现 门面模式的应用场景 1. 解决易用性问题 2. 解决性能问题 3.解决分布式事务问题 总结: 参考资料 前言: 相信我们平时的工作多多少少都涉及过接口设计,为了保证接口的可复用性,我…

【论文阅读】ViT阅读笔记

标题 一张图片可以等价于16*16的单词 transformer可以做大规模的图像识别 摘要 虽然现在transformer在nlp上得到广泛运用,但在cv上还没有运用 一般都是cnnattention 现在用transformer用cv的效果特别好 引言 nlp的主流方式:先做预训练&#xff0…

Linux -- 进阶 Web 服务器 基础前瞻 ( 一 )

目录 WWW 简介 : 组件一个网站得需要哪些东西呢 ?? 1 得有 响应用户申请网页服务 的软件 2 服务器主机 3 那就需要数据了 4. 浏览器 预备知识 : 网址及HTTP 简介 : URL : http 请求方法 :…

SpringCloud微服务技术栈.黑马跟学(十二)

SpringCloud微服务技术栈.黑马跟学 十二 今日目标服务异步通信-高级篇1.消息可靠性1.1.生产者消息确认1.1.1.修改配置1.1.2.定义Return回调1.1.3.定义ConfirmCallback 1.2.消息持久化1.2.1.交换机持久化1.2.2.队列持久化1.2.3.消息持久化 1.3.消费者消息确认1.3.1.演示none模式…

Go 构建基础的事件调度器

👇我在这儿 当我们需要在一段时间后的特定时间或间隔运行任务时,我们需要使用任务调度系统来运行任务:例如发送电子邮件、推送通知、午夜关闭账户、清空表格等。 在本文中,我们将构建一个基本的事件调度程序,使用数据…

LiangGaRy的学习分享

LiangGaRy的学习分享 从小白开始,学习计算机技术;也算是一个比较大的跨越了,专业不对口;本来就没有基础;然后一直摸爬滚打来学习;有好多的心得与体会; 回顾当年上大学的时候,天天玩…

LC-1041 困于环中的机器人(模拟,快慢指针找环)

1041. 困于环中的机器人 难度中等148 在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意: 北方向 是y轴的正方向。南方向 是y轴的负方向。东方向 是x轴的正方向。西方向 是x轴的负方向。 机器人可以接受下列三条指令之一: "…

Codepipeline 跨账号访问 Codecommit

背景 大型企业中代码仓库通常存放在各部门开发账户中,而流水线则位于独立 DevOps 账户中。 本文我们将介绍如何创建跨账号访问 Codecommit 代码仓库的 Codepipeline 流水线,即 CodePipeline 调用另一个账号中的 Codecommit 代码仓库。 亚马逊云科技开发…

【嵌入式烧录/刷写文件】-5.1-详解map格式文件

目录 1 Map文件格式 1.1 TARGET SECTION字段 1.2 FILE SECTION字段 1.3 STARTUP SECTION字段 1.4 SECTION-ALLOCATION SECTION字段 1.5 VECTOR-ALLOCATION SECTION字段 1.6 OBJECT-ALLOCATION SECTION字段 1.7 MODULE STATISTIC字段 1.8 SECTION USE IN OBJECT-ALLOCA…

Nginx配置ssl证书实现https安全访问

目录 一、Nginx的安装与配置 安装步骤 二、SSL证书获取 三、Nginx配置 前题条件,拥有服务器与可以解析到该服务器的自己的域名。 一、Nginx的安装与配置 若已安装好了Nginx,则需查看自己的Nginx是否开启了SSL的模块功能: ./nginx -V 显…

C++类型转换运算符

类型转换运算符是一种特殊的函数,它可以将一个类类型的对象转换为另一种类型的值,或将一个对象引用或指针转换为另一种类型的对象引用或指针。这样一来,我们就可以在某些场合下方便地将一个对象转换为另一种形式。 在 C 中,类型转…

【好刊推荐】知名出版社影响因子7+被踢出SCI,投稿前如何选期刊?

今年3月Hindawi旗下的19本期刊被SCIE剔除,其中有一本影响因子7,以下从期刊各个指标方面分析一下具体原因: 期刊剔除:影响因子7 期刊简介 期刊名称: OXIDATIVE MEDICINE AND CELLULAR LONGEVITY ISSN / eISSN&#…

Grounding DINO-开集目标检测论文解读

文章目录摘要背景算法3.1Feature Extraction and Enhancer3.2. Language-Guided Query Selection3.3. Cross-Modality Decoder3.4. Sub-Sentence Level Text Feature3.5. Loss Function实验4.2 Zero-Shot Transfer of Grounding DINOCOCO数据集LVIS数据集ODinW,开放…

C技能树:Hello World

Hello World 输出 "Hello, World!" 字符串,请选出错误答案。 小知识:Hello World究竟从何而来? Hello, World最早是由 Brian Kernighan 创建的。1978年,Brian Kernighan写了一本名叫《C程序设计语言》的编程书,在程…

一、深入了解容器底层技术

一、容器技术概述 容器技术是一种操作系统级别的虚拟化技术,它可以在同一台物理机上运行多个容器,每个容器都有自己的文件系统、网络、进程和环境变量等,而且它们之间是隔离的,互相之间不会影响。容器技术的出现极大地简化了应用…

GO变量的使用

Go变量的使用注意事项 (1)第一种:指定了变量类型,但是声明后若不赋值,则使用默认值 (2)第二种:根据值自行判断我们的变量类型**(类型推导)** var num10.00 …

【MySQL学习】认识MySQL数据库

目录一、什么是数据库二、主流数据库三、MySQL数据库的基本使用3.1 MySQL的安装3.2 MySQL服务器管理3.3 连接MySQL服务器3.4 MySQL服务器,数据库与表之间的关系3.5 使用案例3.6 数据存储四、MySQL架构五、SQL分类六、存储引擎6.1 定义6.2 查看存储引擎6.3 存储引擎对…

TCP的连接管理机制(三次握手与四次挥手)

目录为啥要三次握手与四次挥手三次握手syn 与 ack三次握手具体流程四次挥手注意为啥要三次握手与四次挥手 相比于UDP, TCP是有连接的, 这个连接就体现在这了. 三次握手就是TCP建立连接, 四次挥手就是TCP断开连接. 三次握手 握手是指通信双方进行网络交互. 三次握手就相当于…

Linux工具——yum和vim

目录 🍏Linux软件包管理器-yum🍎yum简介🍎rzsz工具🍎注意事项🍎软件包查看🍎如何安装和卸载软件 🍏Linux编辑器-vim🍎vim的基本概念🍎vim的基本操作🍎vim正常…

少儿编程 电子学会图形化编程等级考试Scratch三级真题解析(选择题)2022年12月

2022年12月Scratch等级考试一级真题解析 选择题(共25题,每题2分,共50分) 1、默认小猫角色和气球角色都是显示状态,小猫程序如下图所示,气球没有程序,点击绿旗,舞台上最终显示的效果是 A、可能出现6个不同位置的小猫和6个小球 B、可能出现6个不同位置的小猫和1个气球…