乐鱼电竞登录:规划一个可扩展的用户登录体系

发布时间:2021-09-03 14:04:10 来源:leyu乐鱼电竞 作者:leyu乐鱼电竞官网

  在Web体系中,用户登录是最底子的功用。怎样规划一个可扩展的用户登录体系呢?本文结合实践事例对用户登录体系规划进行多维度的解说,协助各规划者在运用中将杂乱变得简略。

  在Web体系中,用户登录是最底子的功用。要完结用户名+暗码登录,许多同学的榜首主意便是直接创立一个Users表,包括username和password两列,这样,就能够完结登录了:

  以微博登录为例,因为微博运用OAuth2协议登录,所以,一个登录用户会包括他的微博身份的ID,一个Access Token用于代表该用户拜访微博的API和一个过期时刻。

  加一个QQ登录Users表就又需求加3列,假如这么扩展下去,改表都得累死,不要说保护代码了。

  无妨换个视点考虑用户登录。当用户以恣意一种办法登录成功后,咱们读取到的总是Users表对应的一行记载,它实践上是用户的个人资料(Profile),而登录进程只是为了认证用户(Authenticate),不管是本地用暗码验证,仍是托付第三方登录,这个进程本质上都是认证。

  而经过用户名口令登录可视为一种Authenticate的办法,运用LocalAuth表保护:

  假如要增加另一种OAuth登录,比方QQ登录,增加一个表就能够了。不过已然咱们都是OAuth宗族的,不如一致到一个表,给每家起个姓名区别就好了:

  有些网站需求API拜访,API能够运用api_key和api_secret来认证,可是怎样把一个API拜访相关到一个用户?办法仍是增加一种API Auth的表:

  每一种X-Auth表都存储了用户的登录认证信息,并经过user_id相关到Users表。这样一来,不光登录进程简化了,而且一个用户能够运用多种办法登录。只需登录成功,拿到了user_id,终究读取Users表是为了取得用户的Profile,这样读出来的数据也更安全,因为Users表不包括用户口令,不会因为露出API而不小心把口令给走漏出去。

  ·Users表只存储User的Profile信息,没有任何认证信息(例如,不存Password);

  ·每一种登录办法对应一个XxxAuth表,该表存储对应的认证信息,以及一个userId字段用于相关到某个User。

  现在的问题是,在Web体系中,因为HTTP恳求本质上是无状况的,每个已认证用户的信息都必须经过Cookie来传递。

  少年,服务器的session也无非是靠一个特别称号的Cookie来辨认罢了,只不过由服务器自身帮你完结了解析Cookie、在session中查找User的进程,而价值却是内存占用高,单台服务器变成有状况,无法简略扩展成集群。遇到不懂事的年轻人,什么都敢往session里扔,很快就把服务器搞死了。

  当用户需求以用户名+口令来登录时,咱们会让用户填写一个登录表单,假如验证经过,就给用户生成一个牢靠的Cookie来标识这个用户:

  当用户需求以第三方OAuth登录时,咱们会让用户重定向到第三方登录页,例如微博登录页,假如用户在第三方登录成功,第三方会再把用户重定向回咱们的网站,并附上一个code表明是否验证经过。假如验证经过,咱们还需求给用户生成一个牢靠的Cookie来标识这个用户:

  这种办法一般不是用户自己主张的恳求,而是由代表用户的机器主张的恳求。因为每个页面都会附上Authorization: Basic XXXXX这个Header,所以每个页面都需求验证。

  这种办法和上一种状况相似,也是由代表用户的机器主张的恳求,不同的是用X-API-Token替代了AuthorizationHeader,更安全牢靠。同上,每个页面都需求验证。

  在这种条件下,用户首要要被导向到一个登录URL,例如,/signin,然后填写用户名和口令。具体验证办法便是运用Users表和LocalAuth表,假如验证成功,咱们就创立一个可信的Cookie给用户。

  经过第三方网站登录也是相似的,要先把用户导向到登录URL,登录成功后,创立一个可信的Cookie。

  承认用户身份,咱们需求一个一致的Authenticator接口。以Java为例,该接口看起来如下:

  接下来,关于每一种类型的认证,咱们都编写一个对应的Authenticator的完结类。例如,针对表单登录后的Cookie,需求一个LocalCookieAuthenticator:

  然后在一个一致的入口处,例如Filter里边,把这些Authenticator悉数串起来,让它们顺次自己去测验认证:

  现在,一个可扩展的认证体系在Web层就底子建立完结了,咱们能够随意组合各种Authenticator,优先级高的放前面。一旦某个Authenticator成功地认证了用户,后边的Authenticator就不执行了。

  当然是放到一个与事务逻辑相关的当地了,比方UserContext中。把Filter代码改写如下:

  还有一个最大的优点,便是事务相关的代码底子就不需求依靠底层HTTP目标,比方session和request,它们只依靠UserContext,这才是真实的解耦,而且十分简略测验事务逻辑,因为不再需求模仿session和request。

  因为Cookie都是服务器端创立的,所以,生成一个可信Cookie的关键在于,客户端无法假造出Cookie。

  例如,核算md5便是一个单向函数。假定写好了函数md5(String s),依据输入能够很简略地核算结果:

  例如,用户以用户名admin,口令hello登录成功后,要生成Cookie,咱们就能够用md5核算:

  当客户端把上面的Cookie发给服务器时,服务器怎样验证该Cookie是有用的呢?能够依照以下进程:

  ·服务器依据数据库中存储的口令核算md5(hello)并与客户端Cookie的md5值比照。

  从理论到实践还差着一个工程的间隔。上面的算法只是处理了底子的验证,在实践运用中,存在如下严重问题:

  ·Cookie没有设置有用期(留意浏览器发过来的Cookie不一定真是浏览器发的),导致一旦登录,永久有用;

  怎样处理?办法是核算hash的时分,不仅只包括用户口令,还包括Cookie过期时刻,以及其他相关随机数,这样核算的hash就十分安全。

  假如用户自己对Cookie进行修正,不管改用户id、过期时刻,仍是hash值,都会导致终究核算结果不一致。

  即运用户知道自己的id和口令,也知道服务器的生成算法,他也无法自己结构出有用的Cookie,原因就在于核算hash时的“体系固定的随机字符串”他不知道。

  这个“体系固定的随机字符串”还有一个用处,便是编写代码的开发人员不知道出产环境服务器装备的随机字符串,他也无法假造Cookie。

  假如用户被认证了,体系实践上就以为从数据库读取的一个User目标是有用的当时用户,现在的问题是,怎样让事务层代码获悉当时用户。

  ·Key值USER需求界提到常量中,但不扫除许多开发人员偷闲直接写死了,这样编译器底子检测不到过错;

  有经历的工程师会指出,没有try...finally逻辑就不对,但这只是知道Java语法后的生搬硬套,也不对。

  这段代码的真实问题是短少封装,没有把完结细节躲藏起来。咱们熟知的开闭准则“对扩展敞开,对修正封闭”,说起来简略,完结起来困难。

  是的,简略与否不看代码量自身,而是看调用起来是不是简略。在Filter中调用起来就十分简略:

  在Web体系中,用户登录是最底子的功用。怎样规划一个可扩展的用户登录体系呢?本文结合实践事例对用户登录体系规划进行多维度的解说,协助各规划者在运用中将杂乱变得简略。来历:廖雪峰的官方网站,作者:廖雪峰。...

  刘志超 译 分布式实验室 限流(Rate Limiting,即速率约束)经过约束每个用户调用API的频率来避免API被过度运用,这能够避免他们因忽略或歹意导致的API乱用。在没有速率约束的状况下,每个用户能够为所欲为地请...

  构建可扩展的体系正成为越来越热的论题。首要是因为越来越多的人运用核算机,不管是交易量仍是预期成绩都大幅增加。 本文仅触及一般性的准则。一般准则 “可扩展性”不等于“原始功用&rdqu...

  提起规划一个依据 HTTP/WebSocket的长衔接订阅/推送服务,咱们立刻能想到市道的不少开源产品。像 SocketIO、Faye 等产品现已供给了适当老练的完结。可是,这类服务出于其通用性和便利上手考虑,往往只包括推送服务...

  可扩展性是呼应式体系规划寻求的重要特性之一,那么怎样考虑规划体系的可扩展性呢? 《可扩展的艺术》一书提出了一个愈加体系的可扩展模型—— AKF可扩展立方 (Scalability Cube)。这个立方体中沿着三个坐标轴设...

  架构规划的高可扩展性表明可经过加机器线性进步体系处理才能,承当更高流量和并发。 因为峰值的流量不行控,不行能在体系架构规划初期就考虑好机器数量以支撑并发。一般依据本钱考虑,在事务平稳期,会预留30%~50...

  目录 1 安全危险 1.1 暴力破解登录1.2 中间人进犯获取暗码 1.3 安全存储用户暗码 2 百度安全登录进程剖析 3 RSA加密登录完结 3.1 RSA加密登录剖析 3.1 后端 3.2 前端 参考资料   1 安全危险 1.1 暴力破解...

  ##前语正如你们所知的那样,微信是一个十分成功的在线服务体系,由几万台服务器组成的体系为几亿人供给着安稳的事务服务。惋惜作为一个一般的工程师底子上不行能有全体规划这样一个体系的时机,即便参加xx 也底子是...

  本文来历大众号:儒猿技能窝 目录  1.抽奖体系的布景引进     2.结合具体事务需求剖析抽奖体系3.一个未经过优化的体系架构     4.负载均衡层的限流     5.Tomcat线程数量的优化     6.依据Redis实...

  github:功用需求:该项目首要完结了前台用户登录注册以及显现用户一切注册信息的功用,后台数据库的比对数据修正增加查询功用。开发东西:mysql,eclipse(装备好jdk和tomcat...

  此文只是代表个人定见,并非行业标准 MQ是全能的高扩展办法? 面向接口是全能的高扩展办法? 提到体系规划的三高,每一高都是一个很巨大的论题,乃至能够用一本书乃至N本书来具体论述。其中高可扩展性是系...

  作者:哒哒哒哒打代码 前语 咱们学写程序时,榜首行代码都是hello world。 可是当你开端学习WEB后台技能时,许多人的榜首个功用便是写的登录(小声:他人我不知道,横竖我是)。 可是我在和许多工作经历较短的同学...

  音讯行列在现在各种体系中都有广泛的运用,除非你做的便是一个独自的东西或小软件, 不然稍大点的体系都会用到音讯行列,它对体系的可扩展性很重要。它依据这样的现实,假如体系的各个模块之间的协作不是经过直接的...

  这是一个金融出资类的项目。用户操作流程相似于在excel中制造财务报表:翻开历史数据;确认运算公式;手艺输入或依据公式核算新的数据。 做这个模型规划,是受最近读的《人月神话》和《范畴驱动规划》一书的影响。...

  今日去面试,面试官让我规划一个cache体系,要求确保最近运用的数据不能被移除出cache,也便是每次增加一个cache项的时分,把最旧的cache项移除出去。 我只记住操作体系里貌...

  本文全面介绍了电商事务做秒杀活动的全体思路,主张咱们只字不差的阅览。本文的作者是「曹林华」,点击「阅览原文」就能够跳转原地址。       前语 最近在部分内部共享了本来在电商事务做秒杀活动的整...

咨询热线:400-029-2366
公司地址:陕西省西安市高新区科技路都荟国际A座1302室
拓展基地:西安市秦岭祥峪森林公园卓远拓展训练基地

在线咨询
全国咨询热线

400-029-2366