在Web系统中,用户登录是最基本的功能。要实现用户名+密码登录,很多同学的第一想法就是直接创建一个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 | 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而不小心把口令给泄露出去。
相关推荐
该系统可让用户轻松地从一个设备向另一个设备传输文件,而无需使用第三方工具或云存储服务。 ## 设计目标 本系统的设计目标包括但不限于以下几点: - 实现高效可靠的文件传输功能 - 提供友好易用的用户界面 - ...
因为业务在 发展,或者需求就有可能需要一个完全动态的可扩展的数据库设计 方案,但是以目前的关系数据库实现这种动态扩展的特性,在系统 一定规模之后所付出的代价是昂贵的,也是不安全的。为了这种动 态扩展性,有...
短视频推荐设计(注意此项目中没有任何第三方推荐算法库,以及协调推荐也没有) IDEA + MySql + Maven + spring-boot + jdk-8u221-windows-x64 Application.java 运行 maven下载慢 ...jdk1.8配置环境变量 ...
本项目是一个基于SSM(Spring、SpringMVC、MyBatis)框架的JavaWeb怀旧唱片售卖系统,结合Vue前端技术,实现了一个具有用户友好性和高度可定制性的在线唱片销售平台。系统的主要功能包括: 1. 用户注册与登录:用户...
多用户微信公众平台管理系统可简单的实现管理员与各个用户间的授权与管理!已强化了功能模块的管理与应用,方便微信功能独立开发。 选择微赞的几个理由 微赞侧重的是功能实用性和后期运营的扩展性 1、微赞程序的承载...
项目旨在设计和实现一个基于ASP.NET的交通信息网上查询系统,为用户提供实时、准确的交通信息查询服务。 主要功能包括: 1. 用户注册与登录:用户可以通过注册账号或使用第三方账号登录系统。 2. 交通信息查询:...
API开放平台系统是一个用于将公司或组织的服务和数据通过API接口开放给第三方开发者使用的平台。这个平台的目的是促进开发者利用这些API接口开发出自己的应用程序或服务,从而创造更多的商业价值。 API开放平台系统...
该系统旨在为用户提供一个简单易用的界面,以帮助他们将论文内容整理成符合学术规范的格式。系统采用响应式设计,兼容各种设备,如台式电脑、笔记本、平板和手机等。 主要功能包括: 1. **用户注册与登录**:用户...
支付系统集成:整合第三方支付接口,如支付宝或微信支付,以便用户可以在线完成支付过程。评论与评价:用户在租赁结束后可以对商品进行评价,这些信息有助于其他用户做出决策,并为商家提供反馈。搜索与推荐:提供...
计算机专业毕设:基于Web...通过本系统的设计和开发,可以为用户提供一个高效、安全、便捷的邮件收发平台,提高工作效率和信息传递速度。同时,本系统还可以根据实际需求进行二次开发和定制,满足不同场景的特殊需求。
3. 交易管理:支持支付宝、微信等第三方支付接口,实现交易的支付、退款、订单查询等功能。 4. 评价管理:用户可以对已购买的游戏账号进行评价,为其他用户提供参考。 5. 客服管理:提供在线客服功能,解答用户在...
另外,在Dj ango框架中,还包含许多功能强大的第三方插件,使得Django具有较强的可扩展性 [2]。Django 项目源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。Django 框架的核心组件有: 1. 2. 用于...
对日益严重的电信欺诈问题,文章设计一个有效、可扩展的电信欺诈管理系统。该系统能够对运营商及第三方的多源数据进行统一、有效管理,采用大数据分析的方法准实时发现电信欺诈事件,针对新型欺诈事件可以快速扩展、...
在用户管理方面,系统提供了用户注册、登录、查询、修改个人信息等功能,同时支持第三方账号登录,极大地方便了用户的操作和使用。在车辆管理方面,系统能够实时监控共享单车的分布情况,提供车辆调度和路线规划功能...
本项目采用原生Servlet技术实现,无需依赖第三方框架,具有较高的性能和可扩展性。同时,项目提供完整的数据库设计(SQL文件),便于用户根据实际需求进行调整和优化。通过本项目,用户可以全面了解人力资源管理系统...
【本科毕业设计项目 源码+说明书+PPT】 随着当今时代新型网络技术的迅速兴起,以及第三产业的蓬勃发展...(4)支持用户上传及管理漏洞扫描所用的第三方插件,可以提高漏洞扫描的效率和性能,提高了系统功能的可扩展性。
系统采用界面与业务逻辑分离的三层结构设计,把业务逻辑封装,提高了系统的安全 性、可维护性、重用性和可扩展性。 关键词:网上拍卖, C#,Access 目录 引言 1 1 绪论 2 1.1 系统需求 2 1.1.1 销售展示模块 2 ...
最新小程序“新闻资讯系统设计Springboot.zip”是一款基于Spring Boot框架开发的新闻资讯服务应用,旨在为用户提供一个简洁、高效的新闻阅读和内容管理系统。该应用通过Spring Boot的快速开发特性,实现了一个轻量级...
系统架构上采用电脑、手机WAP、微网站、APP四网合一数据同步系统,集成主流第三方支付接口,并提供多套网店装修模版,可满足餐饮、外卖商家开店、在线订餐交易服务需求。 本系统上传到服务器/虚拟主机空间即可使用,...