Logon System Design

2023-11-04 02:18
文章标签 design system logon

本文主要是介绍Logon System Design,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

廖雪峰 / 编程 / 2015-7-22 10:22 / Reads: 43843

在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      | a1b23f2c02 | A2      | adam     | c0932f32

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

 id | user_id | weibo_id | weibo_access_token | weibo_expires
----+---------+----------+--------------------+---------------11 | A1      | W-012345 | xxxxxxxxxx         | 60480012 | 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         | 60480012 | A2      | weibo      | W-234567 | xxxxxxxxxx         | 60480013 | A1      | qq         | Q-090807 | xxx-xxx-xxx        | 8640014 | 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 | xxxxxxxxxx12 | A2      | a-234567 | xxxxxxxxxx

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

这篇关于Logon System Design的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/342522

相关文章

Partical System

创建"粒子系统物体"(点击菜单GameObject -> Create Other -> Particle System) 添加"粒子系统组件"(点击Component -> Effects  ->Particle System) 粒子系统检视面板  点击粒子系统检视面板的右上角的"+"来增加新的模块。(Show All Modules:显示全部) 初始化模块: •

小技巧绕过Sina Visitor System(新浪访客系统)

0x00 前言 一直以来,爬虫与反爬虫技术都时刻进行着博弈,而新浪微博作为一个数据大户更是在反爬虫上不遗余力。常规手段如验证码、封IP等等相信很多人都见识过…… 当然确实有需要的话可以通过新浪开放平台提供的API进行数据采集,但是普通开发者的权限比较低,限制也比较多。所以如果只是做一些简单的功能还是爬虫比较方便~ 应该是今年的早些时候,新浪引入了一个Sina Visitor Syst

System.getProperties().

Java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目录 java.vm.specification.version Java 虚拟机规范版本 java.vm.specification.vendor

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

android6/7 system打包脚本

1.android5打包system就是网站上常见的制作ROM必备的解包打包system脚本 指令如下:mkuserimg.sh -s out/target/product/$TARGET_PRODUCT/system out/target/product/$TARGET_PRODUCT/obj/PACKAGING/systemimage_intermediates/system.img

android打包解包boot.img,system.img

原帖地址:http://www.52pojie.cn/thread-488025-1-1.html 转载Mark一下,日后研究 最近工作需要对boot.img,system.img进行破解。顺便将心得分享一下。 我的工作环境是在linux下的。所以工具都是针对linux的。 boot.img破解相关工具: 1、split_boot    perl脚本 2、boot_i

MTK Android P/Q system/vendor/super快速打包

一、Android 新版本默认开启了动态分区,把system vendor  product等分区打包成一个super分区。这对于我们使用替换分区的方法来排查问题不是很方便,直接替换一个super也不知道到底是哪个部分导致的。所以我们需要自己制作super.img来缩小范围。下面讲讲如何快速生成system、vendor、super,以及vbmeta(校验image,不匹配可能会导致不开机) 二

Linux函数fcntl/system学习

本文针对项目中用到的几个函数进行详细分析,并尽可能的添加示例进行验证学习。比如fcntl/ioctl函数、system/exec函数、popen/pclose函数、mmap函数等。 重点参考了《UNP》和《Linux程序设计》第四版。 一、fcntl函数 fcntl函数可以改变或者查看已打开文件的性质。该函数的定义如下: #include <fcntl.h> int fcntl(

Axure元件库Ant Design中后台原型模板:提升设计与开发效率的利器

企业对于中后台产品的设计与开发需求日益增长。为了提升用户体验和开发效率,设计者和开发者们不断寻求更加高效、统一的解决方案。Ant Design,作为阿里巴巴开源的一套企业级UI设计语言和React组件库,凭借其丰富的组件和统一的设计风格,已成为众多项目的首选。而在Axure中使用Ant Design元件库,更是为中后台产品的原型设计带来了极大的便利。 Ant Design简介 Ant D

【UVA】11400-Lighting System Design(动态规划)

这道题感觉状态式不是很好推。。。 WA了好几次是因为排序的时候出问题了。 这道题出在线性结构里了,先说一下最长上升子序列吧。 dp[i]代表了以array[i]结尾的时候,最长子序列长度。 推导的时候,以起点递增的顺序进行推导。 #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#i