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

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

背景

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

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

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

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

基于 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月前
|
资源调度 前端开发 算法
鸿蒙OS架构设计探秘:从分层设计到多端部署
本文深入探讨了鸿蒙OS的架构设计,从独特的“1+8+N”分层架构到模块化设计,再到智慧分发和多端部署能力。分层架构让系统更灵活,模块化设计通过Ability机制实现跨设备一致性,智慧分发优化资源调度,多端部署提升开发效率。作者结合实际代码示例,分享了开发中的实践经验,并指出生态建设是未来的关键挑战。作为国产操作系统的代表,鸿蒙的发展值得每一位开发者关注与支持。
|
8月前
|
JSON API 开发者
深入研究:1688 拍立淘图片搜索 API 详解
本文介绍了 1688 拍立淘图片搜索 API 的功能与使用方法。该 API 支持开发者通过上传图片,在 1688 平台上搜索相似商品,返回商品标题、价格、销量等信息,适用于电商数据分析和商品推荐等场景。文章详细说明了接口的请求方式(HTTP POST)、参数(如 app_key、timestamp、sign 和 image)及 JSON 响应格式。此外,提供了 Python 请求示例代码,涵盖图片 Base64 编码、签名生成、发送请求及响应处理等步骤,帮助开发者快速集成与调试。
|
关系型数据库 MySQL
MySQL查看连接数和进程信息
这篇文章介绍了如何在MySQL中查看连接数和进程信息,包括当前打开的连接数量、历史成功建立连接的次数、连接错误次数、连接超时设置,以及如何查看和终止正在执行的连接进程。
1747 10
|
关系型数据库 MySQL 分布式数据库
PolarDB 与传统数据库的性能对比分析
【8月更文第27天】随着云计算技术的发展,越来越多的企业开始将数据管理和存储迁移到云端。阿里云的 PolarDB 作为一款兼容 MySQL 和 PostgreSQL 的关系型数据库服务,提供了高性能、高可用和弹性伸缩的能力。本文将从不同角度对比 PolarDB 与本地部署的传统数据库(如 MySQL、PostgreSQL)在性能上的差异。
977 1
|
Kubernetes Cloud Native API
掌握Dapr:构建可移植的微服务应用
【10月更文挑战第8天】Dapr(Distributed Application Runtime)是一个开放、可移植的运行时环境,旨在简化微服务应用的构建。它通过提供一套API处理服务发现、状态管理、发布/订阅等常见问题,帮助开发者专注于业务逻辑。本文介绍Dapr的基本概念、核心组件、优势及实施步骤,适用于希望构建弹性、可扩展微服务应用的开发者。
|
算法 Linux 调度
Docker的资源限制实战篇
本文详细介绍了如何利用Docker对容器的资源进行限制,包括内存和CPU的使用。文章首先概述了资源限制的重要性及其在Linux系统中的实现原理,并强调了不当设置可能导致的风险。接着,通过一系列实战案例展示了如何具体设置容器的内存限制,包括硬性限制、动态调整以及软限制等。最后,文章还提供了限制容器CPU访问的具体方法和示例,如指定容器使用的CPU核心数和基于`--cpu-shares`参数对CPU资源进行分配。通过这些实践,读者可以更好地理解和掌握Docker资源管理技巧。
924 14
Docker的资源限制实战篇
|
存储 监控 负载均衡
解读 CIA 三元组:信息安全的基石
【8月更文挑战第31天】
1476 1
|
存储 数据库
微信云开发--云函数--联表查询( lookup 的使用方法详解)
微信云开发--云函数--联表查询( lookup 的使用方法详解)
399 0
|
人工智能 关系型数据库 双11
2024阿里云双11优惠活动开启,云服务器79元一年起,能领代金券和上云补贴金
2024年阿里云双11优惠活动开启,云服务器低至79元一年起,涵盖云数据库、对象存储OSS、无影云电脑等产品,提供代金券、企业算力补贴及上云扶持金等多项优惠,助您轻松上云。
|
JavaScript 前端开发 API
【前端开发】JS同步与异步调用,Vue2基础知识
本文简要介绍了JavaScript中的同步与异步调用以及Vue2的基础知识。 ### JS同步与异步调用 - **同步调用**:代码按顺序执行,每个任务完成后才执行下一个。 - **异步调用**:允许代码并发执行,不必等待前一个任务完成。 - **回调函数**:传统异步模式,如`setTimeout`。 - **Promise**:解决回调地狱问题,链式调用 `.then()`。 - **async/await**:基于Promise,使异步代码看起来像同步代码。 ### Vue2基础知识 - **核心概念**:指令、实例、组件、模板、数据绑定和生命周期钩子。 - **指令**
623 5