用户体系之账户设计

news2024/11/15 19:41:20

文章目录

  • 前言
  • 一、需求分析
    • 1、登录功能
    • 2、退出功能
    • 3、账号绑定功能
    • 3、其他注意事项
  • 二、账户设计
    • 1、表设计
    • 2、QA
  • 三、实践
    • 1、账户密码登录
    • 2、手机号登录
    • 3、第三方授权登录
    • 4、账户统一


前言

随着互联网的发展,越来越多的应用、网站需要用户进行登录才能使用。为了方便用户登录,现在的应用通常提供多种登录方式,比如手机号、微信、抖音、快手 … ,这样你就不用干巴巴的记下账号、密码,通过几种常见的登录方式快速登录,如:

在这里插入图片描述

这篇文章将介绍如何设计一个用户体系,包括认证登录、账号绑定、账号管理等多个功能。在设计功能时,需要考虑到用户体验、系统安全等因素。

另外如何保证同一个用户在不同的登录方式下账号唯一,在本文中我们将重点放在账号设计上。


一、需求分析

1、登录功能

登录功能是用户体系的核心功能之一,它需要实现用户身份认证,保证只有合法用户才能使用应用程序。常见的登录方式包括手机号、微信、抖音、微博等。

对于手机号登录,通常需要用户输入手机号和验证码。在输入手机号后,系统会向用户发送验证码,用户需要输入验证码进行验证。验证码可以有效防止恶意注册和登录,提高账号安全性。

对于微信、抖音、微博等登录方式,通常需要用户授权,即用户需要在对应的应用中授权使用微信、抖音、微博等账号进行登录。在授权后,系统可以获取用户的基本信息,比如昵称、头像等。

为了保证用户账号的唯一性,在用户第一次使用某一种登录方式登录时,系统需要为该用户创建一个唯一的账号,并将该账号与该登录方式进行绑定。

在用户使用其他登录方式登录时,系统需要验证该用户是否已经存在,如果存在则直接将该登录方式与该账号进行绑定,否则需要为该用户创建一个新的账号,然后将该登录方式与该账号进行绑定。

2、退出功能

退出功能是用户体系的另一个重要功能,它需要实现用户退出应用程序,保证用户的账号安全。

在退出时,系统需要清除用户的登录状态,并且保证用户下次登录时需要重新输入账号和密码或者重新授权。

3、账号绑定功能

账号绑定功能是用户体系的一个扩展功能,它可以让用户将多个登录方式与同一个账号进行绑定。比如,用户可以将手机号、微信、抖音、微博等多个账号与同一个系统账号进行绑定,这样用户可以使用任意一种账号登录系统,而无需再进行其他操作。

为了实现账号绑定功能,系统需要为用户提供一个用户账号管理页面,让用户可以在该页面中对账号进行管理。在该页面中,用户可以添加新的登录方式,删除不需要的登录方式,或者修改已有的登录方式。同时,系统需要保证在任意一种登录方式下登录后,用户都可以访问到该账号管理页面,以便于进行账号绑定的操作。

另外,管理端也要设置用户基本信息管理页面,也同样可以对用户账户进行管理,比如绑定、解绑等,当然,这需要设置一定的操作权限。

3、其他注意事项

除了上述介绍的功能外,还有一些其他的注意事项需要考虑,以保证用户体系的完整性和可靠性。

1)手机号加密

为了保证用户账号安全,尤其是手机号信息泄漏问题,系统需要对用户的手机号进行加密存储。常见的加密算法包括MD5、SHA1、SHA256等,系统需要选择合适的加密算法进行密码加密。

2)安全性验证

为了防止恶意登录,系统需要对用户进行安全性验证。比如,可以在用户登录时进行IP地址验证、设备信息验证等,以保证用户的账号安全。

3)防止重复提交

为了保证用户体验,系统需要防止用户进行重复提交。比如,在用户登录时,系统需要对用户进行验证,如果用户已经登录,则直接跳转到应用程序的主页面,而无需再次进行身份认证。

4)账号注销

为了保证用户的隐私权,系统需要提供账号注销功能,让用户可以自主选择注销账号。在用户注销账号时,系统需要清除用户的所有相关信息,并且保证用户无法再次登录。

二、账户设计

1、表设计

账户表:

字段名类型描述
idint用户唯一标识
nicknamevarchar用户昵称
avatarvarchar用户头像地址
genderint用户性别,例如 0 表示未知,1 表示男性,2 表示女性
cityvarchar用户所在城市地址
emailvarchar用户邮箱地址
phone_numbervarchar用户手机号码
created_atdatetime账户创建时间
updated_atdatetime账户更新时间

手机号账户表:

字段名类型描述
idint用户唯一标识
phone_numbervarchar用户手机号
user_idint关联的用户唯一标识
statusint用户状态,0:正常,1:禁用
created_atdatetime账户创建时间
updated_atdatetime账户更新时间

第三方账户表:

字段名类型描述
idint第三方账户唯一标识
typeint第三方账户类型,例如 1 表示微信,2 表示QQ
openidvarchar第三方账户唯一标识
nicknamevarchar第三方账户昵称
avatarvarchar第三方账户头像地址
user_idint关联的用户唯一标识
created_atdatetime账户创建时间
updated_atdatetime账户更新时间

2、QA

问:为什么需要第三方授权登录?

信息时代,各种网站、app 多如牛毛,每个都去设置一个账号密码,你记得住?

现在很多人都会有强依赖的手机应用,比如微信,如果我们可以通过微信授权登录,是不是很方便?

问:第三方授权登录的原理?

现在很多大的平台,比如微信、微博等都会提供【开放平台】给企业开发者进行联调对接,简单的开发对接即可获取到平台的用户信息(当然,非常有限),不过,一般够用了。

对接过程:

  • 一般企业需要先在平台注册开发者账号,拿到开发者账号对应的 appId、appSecret 作为接口交互时的校验凭证。
  • 用户点击登录页,企业应用向平台发起二维码请求,企业应用获取后返回给用户扫码
  • 用户扫码后,平台返回扫码授权 code 给企业应用(通过回调url传回企业应用,注册开发者账号时会填写回调url)。
  • 企业应用通过 code、appId、appSecret 获取预先访问平台凭证 access_token,当然也会携带 openid、unionId等返回
  • 企业应用通过 access_token 获取平台提供的用户基本信息。

目前平台(如微信)一般采用 Auth2.0的授权方式,以上便是 Auth2.0 请求授权的基本流程。

问:表结构设计的考量?

  • 基础账户表:毫无疑问,系统最重要的账户表,相当于用户身份凭证
  • 手机号账户表:目前最常见的登录方式之一,手机验证码登录,无需三方系统授权
  • 三方授权账户表:微信、抖音 这类普及率极高的应用,也可以作为登录凭证;当然,需要事先与基础账户表的用户进行绑定

在这种设计下,用户可以通过基础账户或第三方账户进行登录。当用户使用第三方账户登录时,系统会根据该第三方账户在第三方账户表中查找对应的记录,如果存在,则说明已经存在基础账户,如果不存在,则会创建一个新的基础账户并关联到该第三方账户。

这种设计可以将基础账户信息、手机号以及第三方账户信息进行分离,使得基础账户表只存储系统唯一账户信息,同时也可以很好地支持「多种登录」方式。

问:三方账户放在一张表里会不会不太好?比如扩展性不强?

如果需要更加灵活地支持多种第三方账户类型,也可以考虑使用关系型数据库的多态特性来实现。

例如通过一个公共的第三方账户表来存储所有第三方账户的公共属性,然后针对不同的第三方账户类型再创建对应的子表来存储特定属性。这种设计可以进一步提高系统的扩展性和灵活性。

问:三方账户按三方独立分表存储如何?

微信账户、抖音账户以及微博账户 … 各类三方账户数据完全隔离:

  • 其优点是每个表只存储对应的第三方账户信息,可以更加方便地查询和维护。同时,这种方案也具有更好的扩展性,可以很方便地支持多种第三方账户类型。

  • 不过,这种方案也存在一些缺点。首先,由于每种第三方账户类型都对应一个单独的表,因此需要更多的表空间和存储成本。其次,由于不同的第三方账户类型信息存储在不同的表中,如果需要查询所有的第三方账户信息,需要进行多次查询和数据合并操作,会增加查询的复杂度和开销。

与此相比,将所有的第三方账户信息存储在同一张表中,可以更加方便地进行查询和数据分析,同时也可以减少表的数量和存储成本。当然,这种方案也需要考虑到表结构的设计和索引的优化,以便提高查询效率和系统的扩展性。

总的来说,对于不同的业务场景和需求,需要根据实际情况选择合适的方案。如果需要支持多种第三方账户类型,并且需要对第三方账户信息进行查询和分析,可以考虑将所有的第三方账户信息存储在同一张表中。

如果需要更加灵活地支持多种第三方账户类型,并且需要进行更加复杂的查询和分析操作,可以考虑将不同的第三方账户类型分别存储在对应的表中。

问:哪种更好?

实际上,不同的业务场景和需求会选择不同的方案。在很多情况下,系统会默认支持多种第三方账户类型,例如微信、QQ、微博等,这时候将所有的第三方账户信息存储在同一张表中会更加方便查询和维护。

但是在一些特殊场景下,例如某些系统只支持一个或少数几种第三方账户类型,或者需要对不同类型的第三方账户信息进行更加复杂的查询和分析操作,此时将不同的第三方账户类型分别存储在对应的表中会更加灵活和高效。

因此,需要根据具体的业务需求和系统设计来选择合适的方案。在设计系统时,需要综合考虑系统的扩展性、查询效率、存储成本等因素,并根据实际情况进行权衡和取舍。

三、实践

1、账户密码登录

对比系统账户表的账户id与账户密码是否一致,一致则登录成功。

需要注意的是:

  • 表单提交时,密码要加密
  • 数据库存储密码时不能存储明文

2、手机号登录

利用验证码登录即可。

短信验证码这块可以作为底层基础服务,于业务之外独立实现部署,仅对业务层提供短信发送、验证码验证接口抽象。

验证成功之后需要对账户进行维护:

  • 没有手机号:手机账号表新增记录、并创建系统账户,然后与手机号账户关联
  • 有手机号:查询关联的系统账号

后面就是生成登录凭证(token)~

3、第三方授权登录

这里以微信登录为例:先找到开放平台提供的对应文档:微信登录功能

我们看看整体流程图:

在这里插入图片描述

主流程:

  • 用户点击登录页,企业应用向平台发起二维码请求,企业应用获取后返回给用户扫码
  • 用户扫码后,平台返回扫码授权 code 给企业应用(通过回调url传回企业应用,注册开发者账号时会填写回调url)。
  • 企业应用通过 code、appId、appSecret 获取预先访问平台凭证 access_token,当然也会携带 openid、unionId等返回
  • 企业应用通过 access_token 获取平台提供的用户基本信息。

拿到这些信息后,我们就可以存入第三方账户表,其中 openid 或者 unoinid 一般作为三方账户的唯一凭证,与系统账户表相互关联。

后面的登录凭证(token)就是企业自身去实现了,三方授权登录就算结束。

4、账户统一

账户登录解决了,接下来还需要解决账户统一的问题,比如一个用户有微信、抖音、手机号等多种登录方式,要把他识别成一个系统用户。

这个时候你需要给 C 端用户提供绑定、解绑功能,方便用户关联对应账户。

另外,B 端也可以提供有管理用户权限的 绑定、解绑功能,方便管理用户。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/810913.html

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

相关文章

LeetCode 刷题 数据结构 数组 283题 移动零

难度:简单 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入:…

QGraphicsView实现简易地图2『瓦片经纬度』

前文链接:QGraphicsView实现简易地图1『加载离线瓦片地图』 地图采用GCJ02 Web 墨卡托投影,最小坐标:(-180.00000000000000,-85.05112877980655),最大坐标:(180.00000000000000,85.05112877980655)。瓦片地图单张图片像…

如何通俗理解扩散模型?

扩散模型(Diffusion Model)是一类十分先进的基于扩散思想的深度学习生 成模型。生成模型除了扩散模型之外,还有出现较早的 VAE ( Variational Auto- Encoder,变分自编码器) 和 GAN ( Generative Adversarial Net ,生成对抗网络) 等。 虽然它们…

Cpp学习——类与对象(2)

思维导图: 一,构造函数 1.定义 对于构造函数首先就要知道构造函数怎么写,构造函数怎么写呢?你要知道如下两点: 1.构造函数的函数名要与类名相同 2.构造函数是没有返回值的,但可以有参数。 因为这第二点&am…

ubuntu目录分析

在Ubuntu根目录下,以下是一些常见文件夹的含义: /bin:存放可执行文件,包含一些基本的命令和工具。 /boot:存放启动时所需的文件,如内核和引导加载程序。 /dev:包含设备文件,用于与硬…

关于计算机视觉的Open3D简介

一、说明 Open3D 是一个开源库,使开发人员能够处理 3D 数据。它提供了一组用于 3D 数据处理、可视化和机器学习任务的工具。该库支持各种数据格式,例如 .ply、.obj、.stl 和 .xyz,并允许用户创建自定义数据结构并在程序中访问它们。 Open3D 广…

【雕爷学编程】MicroPython动手做(16)——掌控板之图片图像显示

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

进程_PCB 的理解

目录 一. PCB 的概念 1. 为什么需要PCB 2. PCB的属性 二. task struct 1. task struct 介绍 2. 查看进程指令 3. PID 4. PPID 父进程是什么? 为什么要有父进程? 5. fork 创建子进程 1) fork 后的现象 为什么会打印两次? 2) 的返…

用C语言实现插入排序算法

1.设计思路 用插入排序对长度为n的待排序数组A进行排序的伪代码(在代码中,A中元素的数目n用A.length来表示)。 伪代码如下: INSERTION-SORT(A) for j2 to A.length:keyA[j] //将A[j]插入已排序序列A[1..j-1]ij-1while i>0…

【MTI 6.S081 Lab】Copy-on-write

【MTI 6.S081 Lab】Copy-on-write The problemThe solutionImplement copy-on-write fork (hard)实验任务Hints解决方案问题解决思考uvmcopykfreekallockpagerefcow_handlertrap 虚拟内存提供了一定程度的间接性:内核可以通过将PTE标记为无效或只读来拦截内存引用&a…

Quartz项目搭建与任务执行源码分析

数据库准备 准备一个MySQL数据库,版本为8.0,然后创建一个库,并从quartz官方的版本包中找到名称为tables_mysql_innodb.sql的脚本执行进去(脚本内容文后也有提供)。 项目依赖说明 创建一个Maven项目,引入…

Python方式实现简易弹道计算机

1 问题 本周无意间刷到了德国豹2A5坦克的火控介绍,想自己编写一个不考虑空气阻力以及测风影响的简易弹道计算机(大口径火炮)。 2 方法 由高中物理知识了解到,炮弹出膛之后基本就是抛物线列个抛物线方程就好了; 百度得火炮的弹道方…

【Django学习】(十六)session_token认证过程与区别_响应定制

一、认识session与token 这里就直接引用别人的文章,不做过多说明 网络应用中session和token本质是一样的吗,有什么区别? - 知乎 二、token响应定制 在全局配置表中配置 DEFAULT_AUTHENTICATION_CLASSES: [# 指定jwt Token认证rest_framew…

python_day17_多线程

threading模块 import timedef sing():while True:print("唱歌~~~~~~~~~~~~")time.sleep(1)def dance():while True:print("跳舞############")time.sleep(1) if __name__ __main__:sing()dance()此时为单线程 import threading import timedef sing(…

Java 异常处理的使用和思考

概念 异常处理的概念起源于早期的编程语言,如 LISP、PL/I 和 CLU。这些编程语言首次引入了异常处理机制,以便在程序执行过程中检测和处理错误情况。异常处理机制随后在 Ada、Modula-3、C、Python、Java 等编程语言中得到了广泛采用和发展。在 Java 中&a…

迁移学习《Efficient and Robust Pseudo-Labeling for Unsupervised Domain Adaptation》

1 摘要 问题:无监督域适应传统方法将超过一定置信度阈值的数据视为目标域的伪标记数据,因此选择合适的阈值会影响目标性能。 在本文中,提出了一种新的基于置信度的加权方案来获得伪标签,并提出了一种自适应阈值调整策略&#xff0…

oCPC实践录 | oCPC下机制设计变得毫无意义?(2)无声的战争

接上回oCPC实践录 | oCPC下机制设计变得毫无意义?(1)事出异常必有妖,互联网广告最开始采用的广义第一价格密封拍卖(GFP),对广告主而言,需要不断感知竞争对手的变化,修改报价&#xf…

text-generation-webui加载chatglm2-6b时,报错,要求set the option trust_remote_code=True

背景 使用text-generation-webui加载chatglm2-6b大模型时报错,要求设置option trust_remote_codeTrue,一开始没注意界面,去翻找配置文件,后来发现,就在Model界面,有一个复选框,可以进行设置&am…

IO模型epoll

通过epoll实现一个并发服务器 服务器 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h…

【新星计划】STM32F103C8T6 - C语言 - 蓝牙JDY-31-SPP串口通信实验

文章目录 蓝牙技术的发展历史SPP蓝牙串口BLE协议&#xff08;超低功耗应用蓝牙协议&#xff09; 常见通用蓝牙模块JDY-31-SPPHC05/06 Keil 工程开发模版main.c 源文件&#xff1a;接线方式&#xff1a;烧录工具&#xff1a;FlyMcu串口调试工具&#xff1a;XCOM蓝牙调试助手APP …