设计一个可扩展的用户登录系统

转载 2015年11月20日 15:25:18

在Web系统中,用户登录是最基本的功能。要实现用户名+密码登录,很多同学的第一想法就是直接创建一个Users表,包含usernamepassword两列,这样,就可以实现登录了:

 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 | name | birth等其他字段----+------+-----------------
 A1 | Bob  |  ...
 A2 | Adam | ...

而通过用户名口令登录可视为一种Authenticate的方式,利用LocalAuth表维护:

 id | user_id | username | password----+---------+----------+-----------
 01 | A1      | bob      | a1b23f2c
 02 | A2      | adam     | c0932f32

通过微博登录可视为另一种Authenticate方式,利用OAuth表维护:

 id | user_id | weibo_id | weibo_access_token | weibo_expires----+---------+----------+--------------------+---------------
 11 | A1      | W-012345 | xxxxxxxxxx         | 604800
 12 | A2      | W-234567 | xxxxxxxxxx         | 604800

如果要添加另一种OAuth登录,比如QQ登录,增加一个表就可以了。不过既然大家都是OAuth家族的,不如统一到一个表,给每家起个名字区分就好了:

 id | user_id | oauth_name | oauth_id | oauth_access_token | oauth_expires----+---------+------------+----------+--------------------+---------------
 11 | A1      | weibo      | W-012345 | xxxxxxxxxx         | 604800
 12 | A2      | weibo      | W-234567 | xxxxxxxxxx         | 604800
 13 | A1      | qq         | Q-090807 | xxx-xxx-xxx        | 86400
 14 | A2      | qq         | Q-807060 | xxx-xxx-xxx        | 86400

如果要增加一种新的登录方式,比如SAML,那就再加一种类型的表。

有些网站需要API访问,API可以使用api_key和api_secret来认证,可是怎么把一个API访问关联到一个用户?方法还是增加一种API Auth的表:

 id | user_id | api_key  | api_secret----+---------+----------+------------
 11 | A1      | a-012345 | xxxxxxxxxx
 12 | A2      | a-234567 | xxxxxxxxxx

每一种X-Auth表都存储了用户的登录认证信息,并通过user_id关联到Users表。这样一来,不但登录过程简化了,而且一个用户可以使用多种方式登录。只要登录成功,拿到了user_id,最后读取Users表是为了获得用户的Profile,这样读出来的数据也更安全,因为Users表不包含用户口令,不会因为暴露API而不小心把口令给泄露出去。


设计一个可扩展的用户登录系统 (3)

转 廖雪峰老师---------------- 设计一个可扩展的用户登录系统 (3) 廖雪峰 / 编程 / 2016-4-22 12:12 / 阅读: 5867 在系列 (1)和系列 (2)中...
  • sumin1992
  • sumin1992
  • 2017年01月11日 23:33
  • 239

设计一个可扩展的用户登录系统 (1)

在Web系统中,用户登录是最基本的功能。要实现用户名+密码登录,很多同学的第一想法就是直接创建一个Users表,包含username和password两列,这样,就可以实现登录了: id | use...
  • sumin1992
  • sumin1992
  • 2017年01月11日 23:21
  • 176

设计一个可扩展的用户登录系统 (2)

转自 廖雪峰老师 在设计一个可扩展的用户登录系统 (1)中,我们设计了可扩展的数据库表的结构,基本思想是: Users表只存储User的Profile信息,没有任何认证信息(例如,不存Passwo...
  • sumin1992
  • sumin1992
  • 2017年01月11日 23:26
  • 140

新型领导设计模式—设计可扩展性的业务架构

新型领导设计模式—设计可扩展性的业务架构开闭原则是软件设计最重要的原则之一,设计具有良好可扩展性的业务架构极其依赖该原则。业务品种在增多,已有业务自身也在发展,需要设计一套统一,灵活,互相独立的业务架...
  • kimylrong
  • kimylrong
  • 2015年07月29日 11:41
  • 3207

重构,可扩展设计可操作方案。

思考一个业务系统,物,行为都可以设计 为实体。最重要的是从人角度出发, 行为流程角度: 1. 流程 2.不同类型同一个流程点 实现:不同类型就是不同的策略,可能输入的参数都不同。通过接口来规范。...
  • fei33423
  • fei33423
  • 2016年04月16日 14:30
  • 471

可绑定可扩展的帐号系统设计原理及其实现(一)

转载:http://blog.cocosdever.com/2016/03/08/The-design-principle-and-implementation-of-extensible-accou...
  • zhaoyingm
  • zhaoyingm
  • 2016年09月23日 07:40
  • 1402

为数据库表设计可扩展的字段

在平时的系统设计中,要充分考虑扩展和复用,后面维护过程中出现类似的场景的时候,能够有效的复用之前的。在快速响应业务的同时,也确保系统的稳定性。如何设计扩展性强的数据库结构呢,这里从日常工作中学习了一些...
  • iamzhongyong
  • iamzhongyong
  • 2013年07月11日 09:58
  • 1977

【数据库设计-2】权限设计-系统登录用户权限设计

来源:http://www.cnblogs.com/ssslinppp/ 需求分析—场景假设需要为公司设计一个人员管理系统,并为各级领导及全体员工分配系统登录账号。有如下几个要求:1. ...
  • Zhangdragonfly
  • Zhangdragonfly
  • 2017年03月30日 18:30
  • 1827

数据库中用户登录注册用户信息表怎么设计如何设计

数据库用户表结构设计,数据库中用户登录注册用户信息表怎么设计如何设计?数据库中用户登录注册用户信息表如何设计如何设计?数据表优化构想...
  • test18580
  • test18580
  • 2017年06月23日 14:56
  • 3884

Flume++构建高可用、可扩展的海量日志采集系统%40www.java1234.com.pdf 免费下载

下载地址: Flume++构建高可用、可扩展的海量日志采集系统%40www.java1234.com.pdf...
  • jiongyi1
  • jiongyi1
  • 2017年11月08日 09:25
  • 131
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计一个可扩展的用户登录系统
举报原因:
原因补充:

(最多只允许输入30个字)