关键词:
最近看了看公司后台用户登录系统的设计, 比较混乱, 主要还是因为URS和Oauth以及URS第三方这三个登录形式各不相同导致的。
下面着重介绍一下涉及到第三方登录中需要注意的问题
在一个新项目中, 如果是要建立自己的登录体系的话, 那么直接创建一个Users
表,包含username
和password
两列,这样,就可以实现登录了:
id | username | password | name等其他字段
----+----------+----------+----------------
A1 | bob | a1b23f2c | ...
A2 | adam | c0932f32 | ...
如果要让用户通过第三方登录,比如微博登录或QQ登录,怎么集成进来呢?
以微博登录为例,由于微博使用OAuth2协议登录,所以,一个登录用户会包含他的微博身份的ID,一个Access Token用于代表该用户访问微博的API和一个过期时间。
要集成微博登录,很多童鞋立刻想到把Users
表扩展几列,记录下微博的信息:
id | username | password | weibo_id | weibo_access_token | weibo_expires | name等其他字段
----+----------+----------+----------+--------------------+---------------+----------------
A1 | bob | a1b23f2c | W-012345 | xxxxxxxxxx | 604800 | ...
A2 | adam | c0932f32 | W-234567 | xxxxxxxxxx | 604800 | ...
加一个QQ登录Users
表就又需要加3列,非常不灵活
那么我们需要对这个表进行拆分。当用户以任意一种方式登录成功后,我们读取到的总是Users表对应的一行记录,它实际上是用户的个人资料(Profile),而登录过程只是为了认证用户(Authenticate),无论是本地用密码验证,还是委托第三方登录,这个过程本质上都是认证。
所以,如果把Profile和Authenticate分开,就十分容易理解了。Users表本身只存储用户的Profile, 其中ID为关联不同登录方式的外键。
id | name | birth等其他字段
----+------+-----------------
A1 | Bob | ...
A2 | Adam | ...
而通过用户名口令登录可视为一种Authenticate的方式,利用LocalAuth表维护:
id | user_id | username | password
----+---------+----------+-----------
01 | A1 | bob | a1b23f2c
02 | A2 | adam | c0932f32
通过微博登录可视为另一种Authenticate方式,利用OAuth表维护, 但是access_token一般情况也只有几个小时的时效, 所以存储它是没有意义的, 每次登录的时候去微博后台验证一下客户端传来的token就行了。 如果用户只用了第三方登录, 那就拿第三方数据来填充刚才的User表即可。
id | user_id | weibo_id |
----+---------+----------+
11 | A1 | W-012345 |
12 | A2 | W-234567 |
如果要添加另一种OAuth登录,比如QQ登录,那就再加一个列标示不同站点也就OK了, 但是要注意用户在不同登录方式的用户名和photo一般不一样, 所以也单独存起来
id | user_id | oauth_name | oauth_id | nick_name| photo|
----+---------+------------+----------+----------+------+
11 | A1 | weibo | W-012345 |
12 | A2 | weibo | W-234567 |
13 | A1 | qq | Q-090807 |
14 | A2 | qq | Q-807060 |
通过这种方式, 无论用户采用哪种方式登录, 都可以锁定到用户的user_id。
下面再说一下网易的URS登录, 因为我们要直接采用网易通行证, 所以也就不需自己存储密码, 因此我们的架构应该设为User表
id | user_Email | username | birth
----+------------+----------+-----------
01 | [email protected] | bob |
02 | [email protected] | adam |
如果用户只用第三方登录, 显然无法填充user_Email这个字段, 因此userEmail可以为空。 如果第三方登录采用的是URS第三方的接口, 它返回的oauth_id 是[email protected]这种形式。 具体设计和上面也类似。 整体上使用这种方式比现在后台的逻辑要清晰很多
博客系统(前后端分离版)(代码片段)
...系统的具体实现软件开发的基本流程具体实现的八大功能数据库设计创建数据库操作数据库引入依赖封装DataSource创建实体类将JDBC增删改查封装起来实现博客列表页web.xml的配置文件实现博客系统的展示功能登录功能强制要求用户... 查看详情
mysql基础篇(02):从五个维度出发,审视表结构设计(代码片段)
...热点数据,ClickHouse解决海量数据的实时分析,MySQL关系型数据库存储结构化数据。数据的存储则需要设计对应的表结构,清楚的表结构,有助于快速开发业务,和理解系统。表结构的设计通常从下面几个方面考虑:业务场景、设... 查看详情
mysql基础篇(02):从五个维度出发,审视表结构设计(代码片段)
...热点数据,ClickHouse解决海量数据的实时分析,MySQL关系型数据库存储结构化数据。数据的存储则需要设计对应的表结构,清楚的表结构,有助于快速开发业务,和理解系统。表结构的设计通常从下面几个方面考虑:业务场景、设... 查看详情
评论系统数据库设计及实现(代码片段)
评论系统数据库设计及实现需求分析一般我们浏览网站的时候经常能看到如下图的这种效果(图片来自CSDN)这种评论层层嵌套,每个评论下面还挂着若干个对评论的回复。这种结构类似于树状结构,用户看起来一目了然,也是... 查看详情
怎么设计用户权限管理系统数据库?要用到哪几张表?每张表都有哪些字段?
怎么设计用户权限管理系统数据库?要用到哪几张表?每张表有哪些字段?提供个思路?1、首先在oracle数据库创建教学管理系统需,要用到的数据表如下。2、上述中数据表的其他信息创建。(departments表、class表、students表、cour... 查看详情
数据库表的设计(代码片段)
不是数据库表设计大神 最近做订单系统,出现问题是这样的,有客户表,订单表,套餐表.通过下单生成订单表.付款后更改订单状态码为1(表示已付款)(1)如果甲订购2份黄焖鸡米饭,1瓶矿泉水,那么这个订单如何保存这个数据?剖析:整... 查看详情
9.5授权系统(代码片段)
...GetData”的权限。她是怎么拥有权限的呢?当然不是存在数据库里面就完事了。在调用需要“GetData”权限的“GetDataApi”接口的时候,在访问GetDataApi之前,通过程序,查询登录用户Lulu的权限列表,查询到了“GetData”权限,Lulu就... 查看详情
标签设计方案(代码片段)
设计目标:400W用户200个标签总涉及标签数据8亿条数据1.mysql表结构设计IDuid身份标签ID状态1111212132214330采用一对多的存储方式即一个用户对应多条身份标签2.mysql分表设计2000W数据分一个表(不涉及大数据量存储所以2000W数据为一个表... 查看详情
电商小程序实战教程-权限设计(代码片段)
...一般软件系统的开发需要按照实际的业务场景进行权限的设计。总体上权限是分为普通用户和管理员两种分类。普通用户可以浏览小程序,下单,付款等操作。管理员可以维护数据,管理订单,查看统计数据等。要想实现管理员... 查看详情
数据库表结构设计,常见的数据库管理系统
...热点数据,ClickHouse解决海量数据的实时分析,MySQL关系型数据库存储结构化数据。数据的存储则需要设计对应的表结构,清楚的表结构,有助于快速开发业务,和理解系统。表结构的设计通常从下面几个方面考虑:业务场景、设... 查看详情
抽屉之tornado实战--数据库表设计(代码片段)
经过我们上次分析,数据库要有最基本的四张表,用户表,消息表,类型表,点赞表,评论表,接下来我们看着怎么设计吧 首先我们要清楚,表设计的代码是写在models下的用户表#一张表对应一个类classUserInfo(Base):#把表名赋... 查看详情
2、用户权限管理,数据库表设计
参考技术A网上资料说权限设计=功能权限+数据权限,我认为还是很有道理的。之前项目中只涉及到功能权限,没有数据权限,原因是最开始设计时,数据已经绑定在特定的用户下了,而且涉及到的表数量很少,不需要单独考虑数... 查看详情
基于微信小程序的点餐系统设计(代码片段)
...体功能结构设计流程图124.3.1用户注册124.3.2用户登录134.4数据库概念结构设计134.4.1数据库逻辑结构设计134.4.2数据库逻辑结构设计144.4.3数据库物理结构设计15第5章系统实现245.1用户功能实现245.1.1菜品列表界面245.1.2购物车界面245.1.3... 查看详情
数据库设计表与表之间的关系详细介绍(代码片段)
文章目录数据库设计数据库设计简介表关系之一对多表关系之多对多表关系之一对一数据库设计数据库设计简介软件研发的步骤如下:设计数据库还是很重要的数据库设计概念:数据库设计就是根据业务系统的具体需求,结合... 查看详情
day87-bbs项目数据库设计与简单登陆验证码(代码片段)
一、BBS项目之项目分析项目流程:1搞清楚需求(产品经理)(1)基于用户认证组件和Ajax实现登录验证(图片验证码)(2)基于forms组件和Ajax实现注册功能(3)设计系统首页(文章列表渲染)(4)设计个人站点页面---跨表查询,分组查询(5)... 查看详情
点餐系统数据库设计--sqlserver(代码片段)
目录友情链接1、学生成绩管理系统数据库设计--MySQL2、医疗信息管理系统数据库--MySQL3、邮件管理数据库设计--MySQL4、商品管理系统数据库设计--SQLServer5、SQLServer医疗信息管理系统数据库【英文版-源码】--(MedicalManagementSystemD... 查看详情
医院管理系统数据库,课程设计,sqlserver,纯代码设计(代码片段)
首先创建数据库,并建立各个表之间的主外键约束等,并插入数据。createdatabase医院信息管理系统on(name=医院信息管理系统,filename='D:\\数据库课程设计\\医院信息管理系统\\医院信息管理系统.mdf',size=5,filegrowt... 查看详情
关于聊天记录数据库表结构设计(代码片段)
...用户,然后拓展到n个用用户记录的存储。2、这里会用msql数据库给出数据库表脚本,但是实际生产环境应该是在APP端生成sqlite数据库文件,把sqlite文件上传到server端作为聊天记录存储。有【联系人表】、【群组表】、【会话表】... 查看详情