简介
这篇文章可作为方案设计文档参考,读者可根据需要自行修改格式。
单点登录功能详细设计文档 V1.0.0
1. 需求描述
此功能用于用户登录,当用户进入页面页面时,首先会加载出一段验证码以及账号文本框、密码文本框、是否记住密码文本框(这就是介绍系统功能的入口),当用户输入账号密码验证码并点击登录之后,会检查账户密码是否输入规范,这就涉及到文本框空校验以及密码是否符合要求等判断。
若都符合要求之后,系统就会开始校验用户输入的信息是否正确,若账户、密码、验证码等有一环输入错误的,界面就会做出响应的响应信息,并提示用户重新输入。
若输入正确,则需要判断用户是否点击了记住密码文本框,若选择记住密码,则下次记住密码时无需再输入密码就可以完成直接登录。若没有记住密码则反之。
2.功能拆分
1. 制作一个登录界面 2. 登录界面需要实时渲染验证码,需要集成Kaptcha技术。 3. 一个获取验证码的接口 4. 登录接口 5. 单点登录校验验证码时,需要将用户输入验证码与用户点击登录时页面验证码进行比对,由于界面验证码实时刷新,所以我们需要想办法存住验证码,所以我们需要集成redis将密码进行缓存
3.流程图
注:白色是前端流程,蓝色是后端流程
3.1页面加载时,获取验证码流程图
3.2登录流程图
4. 接口设计
4.1获取验证码接口
4.1.1接口
描述 | 获取验证码图片 | |||
请求地址 | /admin/kaptcha /image-code/{imageCodeToken} | |||
请求方式 | GET | |||
入参 | 参数 | 名称 | 类型 | 说明 |
imageCodeToken | 验证码token | String | 必传,由前端生成,尽可能实现唯一 | |
出参 | 参数 | 名称 | 类型 | 说明 |
验证码流数据 | 验证码图片 | stream | 一张图片的流数据 |
4.1.2处理逻辑
1. 前提“集成kaptcha,引入jar,增加配置类 2. 使用kaptcha的createText生成验证码字符串 3. 以imgToken为key,text为value存入redis中,设置市场为300s 4. 使用kaptcha的createImage生成验证码图片
4.2 获取验证码接口
4.2.1 接口
描述 | 登录接口 | |||
请求地址 | /admin/login | |||
请求方式 | POST | |||
入参 | 参数 | 名称 | 类型 | 说明 |
loginName | 用户名 | String | 必传 | |
loginName | 用户名 | String | 必传 | |
password | 密码 | String | 必传 | |
code | 验证码 | String | 必传 | |
imgToken | 验证码token | String | 必传,用于从redis中捞取密码 | |
出参 | 参数 | 名称 | 类型 | 说明 |
id | 用户ID | String | ||
loginName | 账号 | String | ||
name | 昵称 | String | ||
token | 登录凭证 | String | ||
resource | 权限资源 | List |
显示详细信息
4.2.2 处理逻辑
1.对传入的密码进行二次加密 2.验证码校验,根据传入的imageCodeToken,到redis中获取text, a)获取不到,报错返回:验证码已过期 b)获取到后,与传入的imageCode作比较 i.相等,继续往后 ii.不相等,返回验证码错误 3.验证码校验通过后,删除redis中的imageCodeToken 4.登录校验,根据loginName获取用户信息 a)获取不到,打日志:用户名不存在;报错返回:用户名不存在或密码错误 b)获取到了,比较参数密码与数据库密码 i.相等,登录校验成功 ii.不相等,打日志:密码不对;报错返回:用户名不存在或密码错误 5.校验通过后,加载资源权限 6.组装用户登录信息LoginUserDto 7.生成唯一token,作为用户登录标识 8.以token为key,LoginUserDto为value,存入redis中 9.返回登录结果
5. 页面设计
一般包含几方面的内容:
如何进入页面? 页面有哪些操作元素? 表单有哪些校验? 点击按钮做什么操作? 有哪些看不见的逻辑? 跟后端有哪些交互?
以及本功能为例,我们可以这样写:
一般包含几方面的内容:
如何进入页面?点击连接进入 页面有哪些操作元素?账号框、 密码框、 验证码框、 记住我按钮、 登录按钮 表单有哪些校验?非空校验、密码正则 点击按钮做什么操作?验证码文本框、调用后端接口 有哪些看不见的逻辑?校验 跟后端有哪些交互? 获取验证码接口、获取登录接口
6. 跑批设计
包括跑批的时间、周期、处理逻辑、关联跑批等 可以考虑下面几个问题: 数据量是否很大,是否需要分页? 跑批期间数据是否会更新? 多个跑批之间是否会有先后? 跑批失败如何重跑?
7. 数据库设计
本次变更相关的数据库脚本
8. 安全设计
数据加密、接口加签验签、前后端参数校验、常见的漏洞处理、敏感数据处理。
以本次功能设计为例,这其中就涉及前端密码md5Salt加密
9. 性能设计
大数据量跑批,如每天的报表跑批
高访问量接口,如首页数据
大流量接口,如文件上传