老板:公司系统太多,能不能实现账号互通?(一)

简介: 最近开发新产品,然后老板说我们现在系统太多了,每次切换系统登录太麻烦了,能不能做个优化,同一账号互通掉。作为一个资深架构狮,老板的要求肯定要满足,安排!

背景

最近开发新产品,然后老板说我们现在系统太多了,每次切换系统登录太麻烦了,能不能做个优化,同一账号互通掉。作为一个资深架构狮,老板的要求肯定要满足,安排!

一个公司产品矩阵比较丰富的时候,用户在不同系统之间来回切换,固然对产品用户体验上较差,并且增加用户密码管理成本。

也没有很好地利用内部流量进行用户打通,并且每个产品的独立体系会导致产品安全度下降。

因此实现集团产品的单点登录对用户使用体验以及效率提升有很大的帮助。那么如何实现统一认证呢?我们先了解一下传统的身份验证方式。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

传统 Session 机制及身份认证方案

Cookie 与服务器的交互

微信图片_20220908102930.png

众所周知,http 是无状态的协议,因此客户每次通过浏览器访问 web。

页面,请求到服务端时,服务器都会新建线程,打开新的会话,而且服务器也不会自动维护客户的上下文信息。

比如我们现在要实现一个电商内的购物车功能,要怎么才能知道哪些购物车请求对应的是来自同一个客户的请求呢?

微信图片_20220908103029.png

因此出现了 session 这个概念,session 就是一种保存上下文信息的机制,他是面向用户的,每一个 SessionID 对应着一个用户,并且保存在服务端中。

session 主要以 cookie 或 URL 重写为基础的来实现的,默认使用 cookie 来实现,系统会创造一个名为 JSESSIONID 的变量输出到 cookie 中。

JSESSIONID 是存储于浏览器内存中的,并不是写到硬盘上的,如果我们把浏览器的cookie 禁止,则 web 服务器会采用 URL 重写的方式传递 Sessionid,我们就可以在地址栏看到 sessionid=KWJHUG6JJM65HS2K6 之类的字符串。

通常 JSESSIONID 是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的 sessionid,这样我们信息共享的目的就达不到了。

服务器端的 session 的机制

当服务端收到客户端的请求时候,首先判断请求里是否包含了 JSESSIONID 的 sessionId,如果存在说明已经创建过了,直接从内存中拿出来使用,如果查询不到,说明是无效的。

如果客户请求不包含 sessionid,则为此客户创建一个 session 并且生成一个与此 session 相关联的 sessionid,这个 sessionid 将在本次响应中返回给客户端保存。

对每次 http 请求,都经历以下步骤处理:

  • 服务端首先查找对应的 cookie 的值(sessionid)。
  • 根据 sessionid,从服务器端 session 存储中获取对应 id 的 session 数据,进行返回。
  • 如果找不到 sessionid,服务器端就创建 session,生成 sessionid 对应的 cookie,写入到响应头中。

session 是由服务端生成的,并且以散列表的形式保存在内存中。

基于 session 的身份认证流程

基于 seesion 的身份认证主要流程如下:

微信图片_20220908103050.png

因为 http 请求是无状态请求,所以在 Web 领域,大部分都是通过这种方式解决。但是这么做有什么问题呢?我们接着看。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

集群环境下的 Session 困境及解决方案

随着技术的发展,用户流量增大,单个服务器已经不能满足系统的需要了,分布式架构开始流行。

微信图片_20220908103121.png

通常都会把系统部署在多台服务器上,通过负载均衡把请求分发到其中的一台服务器上,这样很可能同一个用户的请求被分发到不同的服务器上。

因为 session 是保存在服务器上的,那么很有可能第一次请求访问的 A 服务器,创建了 session,但是第二次访问到了 B 服务器,这时就会出现取不到 session 的情况。

我们知道,Session 一般是用来存会话全局的用户信息(不仅仅是登陆方面的问题),用来简化/加速后续的业务请求。

传统的 session 由服务器端生成并存储,当应用进行分布式集群部署的时候,如何保证不同服务器上 session 信息能够共享呢?

Session 共享方案

Session 共享一般有两种思路:

  • session 复制
  • session 集中存储
①session 复制

session 复制即将不同服务器上 session 数据进行复制,用户登录,修改,注销时,将 session 信息同时也复制到其他机器上面去。

微信图片_20220908103232.png

这种实现的问题就是实现成本高,维护难度大,并且会存在延迟登问题。

②session 集中存储

微信图片_20220908103418.png

集中存储就是将获取 session 单独放在一个服务中进行存储,所有获取 session 的统一来这个服务中去取。

这样就避免了同步和维护多套 session 的问题。一般我们都是使用 redis 进行集中式存储 session。

多服务下的登陆困境及 SSO 方案

SSO 的产生背景

微信图片_20220908103426.png

如果企业做大了之后,一般都有很多的业务支持系统为其提供相应的管理和 IT 服务,按照传统的验证方式访问多系统,每个单独的系统都会有自己的安全体系和身份认证系统。

进入每个系统都需要进行登录,获取 session,再通过 session 访问对应系统资源。

这样的局面不仅给管理上带来了很大的困难,对客户来说也极不友好,那么如何让客户只需登陆一次,就可以进入多个系统,而不需要重新登录呢?

微信图片_20220908103506.png


“单点登录”就是专为解决此类问题的。其大致思想流程如下:通过一个 ticket 进行串接各系统间的用户信息。


相关文章
|
9月前
|
网络协议 数据安全/隐私保护 Windows
当不在公司时,如何在外远程登录公司内网OA系统?
当不在公司时,如何在外远程登录公司内网OA系统?
185 0
|
19天前
|
存储 数据采集 运维
云效产品使用报错问题之给公司同事配置了权限,但是看不见项目,如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
5月前
|
人工智能 供应链 搜索推荐
代购系统独立站的未来发展前景
随着全球互联网的普及和电子商务的飞速发展,代购行业也呈现出迅猛增长的态势。代购系统独立站作为代购行业的重要组成部分,以其独特的商业模式和运营方式,吸引了越来越多的用户和投资者的关注。本文将从多个角度探讨代购系统独立站的未来发展前景,并分析其面临的挑战和机遇。
|
9月前
|
网络协议 应用服务中间件 数据库
如何在出差期间远程访问企业ERP系统?内网穿透解决您的难题!
如何在出差期间远程访问企业ERP系统?内网穿透解决您的难题!
133 0
|
小程序
小李,提前约一下会议室和建日程并思考一下想要沟通的事情!
小李,提前约一下会议室和建日程并思考一下想要沟通的事情!
|
SQL JSON 前端开发
校园外卖点餐系统——Day02【员工管理业务开发】
校园外卖点餐系统——Day02【员工管理业务开发】
125 0
校园外卖点餐系统——Day02【员工管理业务开发】
|
安全 NoSQL Redis
老板:公司系统太多,能不能实现账号互通?(二)
老板:公司系统太多,能不能实现账号互通?(二)
老板:公司系统太多,能不能实现账号互通?(二)
|
网络安全 数据安全/隐私保护
云机房管理操作经验
欢迎你成为一个合格的云机房管理员 对于现在的高校机房现状,现在云机房已经大面积更换为云机房,这篇文章属于深信服云机房。在这里我发布一些自己在机房的管理经验
291 0
好好编程-物流项目20【客户管理-删除客户】
好好编程-物流项目20【客户管理-删除客户】
好好编程-物流项目20【客户管理-删除客户】
|
弹性计算 运维 安全
大型企业多账号管理“安全心法”
云上多账号环境下的网络统一管理,是大型分支型企业网络安全防护的必经之路。无论是外企入华、国内企业出海,还是本土集团型企业规模化成长,云上统一网络安全管控与整体安全态势感知,都可以拉齐企业账号间安全水位,让安全防护无死角。
867 0
大型企业多账号管理“安全心法”