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

news2024/12/25 7:27:19

  • 需求
  • 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.coloradmin.cn/o/422276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【面试】如何设计SaaS产品的数据权限?

文章目录前言数据权限是什么?设计原则整体方案RBAC模型怎么控制数据权限?1. 数据范围权限控制2. 业务对象操作权限控制3. 业务对象字段权限控制总结前言 一套系统的权限可以分为两类,数据权限和功能权限,今天我们从以下几个点&am…

阿里云服务器安装宝塔面板搭建网站全流程(一步步详解)

阿里云服务器安装宝塔面板教程,云服务器吧以阿里云Linux系统云服务器安装宝塔Linux面板为例,先配置云服务器安全组开放宝塔所需端口8888、888、80、443、20和21端口,然后执行安装宝塔面板命令脚本,最后登录宝塔后台安装LNMP&#…

UML 简易使用教程

最近刚好有空,遂决定对应 UML 常用的一些图进行整理,供自己以及需要的人查阅。 UML 分为静态模型与动态模型。静态模型描述一个系统的静态特征,固定的框架结构。包括用例图、类图、对象图、组件图、部署图;动态模型包括时序图、协…

TensorFlow 智能移动项目:11~12

原文:Intelligent mobile projects with TensorFlow 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只…

Flutter 第一个界面

第一个页面 app首页 入口函数 一个Flutter工程的入口函数与Dart命令行工程一样是main,不同的是在Flutter中执行runApp(ArticleApp()) 就能够在手机屏幕上展示这个Widget。 import package:flutter/material.dart; void main() > runApp(new ArticleApp()); Ar…

OpenAI不能访问有什么方法解救呢?试试这方法吧

最近发现国内不挂代理是不能访问到openAI的接口的,为了解决这个问题,我一直在github上需在解决方案,今天终于被我找到一个大神开源了一个解决方案。下面就来看看如何做吧。 整个项目的代码很简单只有几行代码: {"rewrites&q…

几种在Python中List添加、删除元素的方法

嗨害大家好鸭!我是爱摸鱼的芝士❤ 一、python中List添加元素的几种方法 List 是 Python 中常用的数据类型, 它一个有序集合, 即其中的元素始终保持着初始时的定义的顺序 (除非你对它们进行排序或其他修改操作)。 …

进程互斥的实现方式

1.进程互斥的软件实现方法 1.单标志法 算法思想:两个进程在访问完临界区后会把使用临界区的权限转让给另一个进程,也就是说每个进程进入临界区的权限只能被另一个进程赋予 局限性 2.双标志先检查法 算法思想:设置一个布尔数组flag[]&#xff…

python 笔记:PyTrack(将GPS数据和OpenStreetMap数据进行整合)【官网例子解读】

论文笔记:PyTrack: A Map-Matching-Based Python Toolbox for Vehicle Trajectory Reconstruction_UQI-LIUWJ的博客-CSDN博客4 0 包的安装 官网的两种方式我都试过,装是能装成功,但是python import PyTrack包的时候还是显示找不到Pytrack …

Altova MapForce 2023 Crack

Altova MapForce 2023 Crack 数据映射项目中的注释-除了支持对数据映射项目的单个连接进行注释外,现在还可以向源组件和目标组件添加注释,以帮助记录映射的作用和实现方式。 支持XML输出中的standalone“yes”声明-在独立文档声明中,值“yes”…

Chat-GLM 详细部署(GPU显存>=12GB)

建议配置: ( Windows OS 11 部署 )CPU-i7 13700F ~ 13700KF RAM: 16GB DDR4 GPU: RTX3080(12G) 安装 conda: 1. 下载安装 miniconda3 : https://docs.conda.io/en/latest/miniconda.html conda是一个包和环境管理工具,它不仅能管理包,还能隔…

Linux嵌入式学习之Ubuntu入门(四)Makefile

系列文章目录 一、Linux嵌入式学习之Ubuntu入门(一)基本命令、软件安装及文件结构 二、Linux嵌入式学习之Ubuntu入门(二)磁盘文件介绍及分区、格式化等 三、Linux嵌入式学习之Ubuntu入门(三)用户、用户组…

go语言切片做函数参数传递+append()函数扩容

go语言切片函数参数传递append()函数扩容 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 二叉树递归go代码: var ans [][]int func pathSum(root *TreeNode, targetSum int) ( [][…

Longitudinal Change Detection on Chest X-rays Using Geometric Correlation Maps

文章来源:[MICCAI2019] Keywords:Chest X-ray;Longitudinal analysis;Change detection;Geometric correlation 一、本文提出的问题以及解决方案 在胸部X-ray图像的诊断中,医生会考虑与先前检查相比病变的…

8.网络爬虫—正则表达式RE实战

8.网络爬虫—正则表达式RE实战正则表达式(Regular Expression)re.Ire.Are.Sre.Mre.Xre.Lre.U美某杰实战写入csv文件:前言: 🏘️🏘️个人简介:以山河作礼。 🎖️🎖️:Pyth…

MongoDB 聚合管道的文档操作($sort,$skip,$limit,$sample,$unwind)

目前为止,我们已经介绍了一部分聚合管道中的管道参数: $match:文档过滤 $group:文档分组,并介绍了分组中的常用操作:$addToSet,$avg,$sum,$min,$max等。 $add…

COCO数据集相关知识介绍

👨‍💻个人简介: 深度学习图像领域工作者 🎉总结链接: 链接中主要是个人工作的总结,每个链接都是一些常用demo,代码直接复制运行即可。包括: &am…

SpringTx 源码解析 - @Transactional 声明式事务执行原理

一、Spring Transactional 声明式事务执行原理 Transactional 是 Spring 框架中用于声明事务的注解,可以标注在方法或类上。当标注在类上时,表示该类的所有public方法都将支持事务。当标注在方法上时,表示该方法将在一个事务内执行。 Trans…

BGP对等体建邻配置

BGP对等体大体分为EBGP对等体和IBGP对等体。而BGP对等体的建邻主要分为两种:1、使用物理接口建邻 2、使用环回借口建邻,针对不同的BGP对等体选用不同的建邻方式。 EBGP的建邻主要使用的是物理接口建邻 IBGP的建邻主要使用的是环回接口建邻 这两种建邻方…

VBA的面向接口编程

工作中有时候会用到VBA(Visual Basic for Applications),不是很多,也没有专门去学习VBA,用的时候遇到问题就上网去查资料,解决问题了就放下了。 今天被同事问到VBA中类的用法,我从来没有用过&am…