什么是单点登录

前言:

是时候了解一下SSO相关的知识了,本篇主要是概念篇,发现网上两篇不错的文章,简单整合了一下,原文链接:
https://www.cnblogs.com/Java3y/p/10877465.html
https://www.cnblogs.com/EzrealLiu/p/5559255.html

1、什么是SSO?

SSO( Single Sign-On ),中文意即单点登录,单点登录是一种控制多个相关但彼此独立的系统的访问权限,拥有这一权限的用户可以使用单一的ID和密码访问某个或多个系统从而避免使用不同的用户名或密码,或者通过某种配置无缝地登录每个系统。

SSO的一种较为通俗的定义是:SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。

术语比较绕,简单概括:一次登录,全部访问。

单点登录包含三个核心元素,即:用户、系统、验证中心。

以前我们的系统都是单系统,所有的功能都是在同一个系统上完成的。

后来,我们为了合理利用资源和降低耦合性,于是把单系统拆分成多个子系统。

从单系统到拆分成多个子系统,用户登陆发生了什么变化呢?

以前登陆:用户 > 系统
现在登陆:用户 > 认证中心 > 系统

认证中心帮我们解决所有系统共享登陆。

2、SSO示例

阿里系的淘宝和天猫,很明显地我们可以知道这是两个系统,但是你在使用的时候,登录了天猫,淘宝也会自动登录。

不上多图片了,可自行尝试,淘宝的登陆网址为:login.taobao.com,我们在这个网站上登陆成功后,之后再访问 i.taobao.com 、trade.taobao.com 、www.tmall.com 等子系统将不再需要重新登录。

淘宝天猫的这个示例已经很明显的展现了 SSO 的作用,一次登陆,全部访问。

3、SSO要解决的问题(多系统登录的问题与解决)

3.1 Session不共享问题

单系统登录功能主要是用 Session 保存用户信息来实现的,但我们清楚的是:多系统即可能有多个 Tomcat,而 Session 是依赖当前系统的 Tomcat,所以系统A 的 Session 和系统B 的 Session 是不共享的。

不共享会发生什么?A系统登陆的用户,无法在B系统上直接使用。

解决系统之间的 Session 不共享问题有以下几种方案:

  • Tomcat集群Session全局复制(集群内每个tomcat的session完全同步)【会影响集群的性能呢,不建议】
  • 根据请求的IP进行Hash映射到对应的机器上(这就相当于请求的IP一直会访问同一个服务器)【如果服务器宕机了,会丢失了一大部分Session的数据,不建议】
  • 把Session数据放在Redis中(使用Redis模拟Session)【建议】
    -- 比如上篇提到的spring-session框架:https://www.cnblogs.com/niceyoo/p/11258392.html

我们可以将登录功能单独抽取出来,做成一个子系统。

SSO(登录系统)的逻辑如下:

  • SSO系统生成一个token,并将用户信息存到Redis中,并设置过期时间
  • 其他系统请求SSO系统进行登录,得到SSO返回的token,写到Cookie中
  • 每次请求时,Cookie都会带上,拦截器得到token,判断是否已经登录

至此,其实我们会发现其实就两个变化:

  • 将登陆功能抽取为一个系统(SSO),其他系统请求SSO进行登录
  • 本来将用户信息存到Session,现在将用户信息存到Redis
3.2 Cookie跨域问题

上面我们解决了Session不能共享的问题,但其实还有另一个问题。Cookie是不能跨域的

比如说,我们请求 https://www.google.com/ 时,浏览器会自动把google.com的Cookie带过去给google的服务器,而不会把 https://www.baidu.com/ 的Cookie带过去给google的服务器。

这就意味着,由于域名不同,用户向系统A登录后,系统A返回给浏览器的Cookie,用户再请求系统B的时候不会将系统A的Cookie带过去。

针对Cookie存在跨域问题,有几种解决方案:

  1. 服务端将Cookie写到客户端后,客户端对Cookie进行解析,将Token解析出来,此后请求都把这个Token带上就行了
  2. 多个域名共享Cookie,在写到客户端的时候设置Cookie的domain。
  3. 将Token保存在SessionStroage中(不依赖Cookie就没有跨域的问题了)

到这里,我们已经可以实现单点登录了。

4、CAS原理

说到单点登录,就肯定会见到这个名词:CAS (Central Authentication Service),下面说说CAS是怎么搞的。

如果已经将登录单独抽取成系统出来,我们还能这样玩。现在我们有两个系统,分别是www.java3y.com和www.java4y.com,一个SSO www.sso.com

首先,用户想要访问系统A www.java3y.com 受限的资源(比如说购物车功能,购物车功能需要登录后才能访问),系统A www.java3y.com 发现用户并没有登录,于是重定向到 SSO 认证中心,并将自己的地址作为参数。请求的地址如下:

www.sso.com?service=www.java3y.com

SSO 认证中心发现用户未登录,将用户引导至登录页面,用户进行输入用户名和密码进行登录,用户与认证中心建立全局会话(生成一份 Token,写到 Cookie 中,保存在浏览器上)

随后,认证中心重定向回系统A,并把 Token 携带过去给系统A,重定向的地址如下:

www.java3y.com?token=xxxxxxx

接着,系统A去 SSO 认证中心验证这个 Token 是否正确,如果正确,则系统A和用户建立局部会话(创建Session)。到此,系统A和用户已经是登录状态了。

此时,用户想要访问系统B www.java4y.com 受限的资源(比如说订单功能,订单功能需要登录后才能访问),系统B www.java4y.com 发现用户并没有登录,于是重定向到 SSO 认证中心,并将自己的地址作为参数。请求的地址如下:

www.sso.com?service=www.java4y.com

注意,因为之前用户与认证中心 www.sso.com 已经建立了全局会话(当时已经把 Cookie 保存到浏览器上了),所以这次系统B重定向到认证中心 www.sso.com 是可以带上 Cookie 的。

认证中心根据带过来的 Cookie 发现已经与用户建立了全局会话了,认证中心重定向回系统B,并把 Token 携带过去给系统B,重定向的地址如下:

www.java4y.com?token=xxxxxxx

接着,系统B去 SSO 认证中心验证这个 Token 是否正确,如果正确,则系统B和用户建立局部会话(创建Session)。到此,系统B和用户已经是登录状态了。

看到这里,其实SSO认证中心就类似一个中转站。

5、本篇小结

SSO 这一理念到目前为止已经非常成熟,关于它的各种设计、设置都可以定制一套标准了。然而由于 SSO 与用户有强关联,所以很多设计在最初时往往会把 SSO 设计成一个用户管理系统,而使得 SSO 与业务耦合,随着业务的不断变化和演进,底层数据结构、接口不断的复杂化,又反过来使得上层服务的架构设计变得尴尬。

若做更进一层的抽象和划分,SSO只需负责登录这单一功能即可,设计上满足单一职责原则。
加上几乎所有网站的登录都大同小异(可能登录界面会变幻无常)且不与业务有过多牵连,这又使得SSO与业务完全分离,无论将来业务怎样演进,产品如何迭代,SSO作为底层应用可以以不变应万变。

为什么要有SSO? 即SSO在解决什么问题?

随着业务的不断扩大,必然会对很多服务进行拆分,比如会做 SOA 服务,会使用 Dubbo 做微服务,或者简单的小型分布式等,总之,拆分后的子系统必然存在着 session 同步等问题,目前 SSO 解决方案,目前比较流行的方案。

转载了一篇<我们为何需要单点登录系统>,可以围观一下。

下篇我们将通过一个国产框架 xxl-sso 了解一下单点登录整个流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

支付宝H5支付,ISV权限不足

报错如下&#xff1a; 登录支付宝商户平台&#xff0c;发现签约产品已失效&#xff1a; 重新申请&#xff0c;修改网址之后就成功了&#xff1a;

我们为何需要单点登录系统

SSO&#xff0c;Single Sign On&#xff0c;也就是单点登录&#xff0c;保证一个账户在多个系统上实现单一用户的登录 现在随着网站的壮大&#xff0c;很多服务会进行拆分&#xff0c;会做SOA服务&#xff0c;会使用dubbo做微服务&#xff0c;或者简单的小型分布式&#xff0c…

微信JSAPI支付,报错当前页面的URL未注册

调用微信统一支付的接口&#xff0c;支付时报错&#xff1a; 解决方案&#xff1a; 打开微信商户平台&#xff0c;将当前页面的URL配置到JSAPI域名。

借助xxl-sso实现SSO

前言 市场上一下主流的SSO技术搭配方案&#xff1a; SpringSecurity OAuth2 SpringSecurity CAS 功能较弱&#xff0c;对前后端分离的项目支持不是很好Shiro CAS JWT 可以自定义需求&#xff0c;灵活扩展鉴权方式 本篇主要是单点登录&#xff0c;不涉及鉴权&#xff0c;后面…

C语言数组初始化的问题

转载于:https://www.cnblogs.com/chulin/p/8880184.html

blocked by CORS policy,是否跨域?

经排查不是跨域的问题&#xff0c;代码报错&#xff0c;改好就解决了 2021.10.20 项目上线又报错&#xff0c;测试环境一直没问题&#xff0c;上线了就报这个错&#xff0c;如果是前端代码的问题&#xff0c;那么使用测试接口的时候肯定也会报这个错&#xff0c;所以排除前端代…

那些一眼就被看出包装过的简历

本文作者&#xff1a;Coody原文链接&#xff1a;https://my.oschina.net/hooker/blog/3014656 前言 在互联网极速膨胀的社会背景下&#xff0c;各行各业涌入互联网的IT民工日益增大。 早在2016年&#xff0c;我司发布了Java、Ios工程师的招聘信息&#xff0c;就Java工程师单个岗…

sql 查询优化小计

好久没更博了&#xff0c;偷偷的抽时间写一下。 早上开始working的时候&#xff0c;发现一个页面加载很慢&#xff0c;经排查是昨天写的一条联合查询的sql导致的。于是着手优化&#xff01; 首先想到的是在join的时候&#xff0c;减少表体积之后再进行关联&#xff0c;于是有了…

微信支付宝扫一扫进入小程序的相关配置

需求: 微信小程序和支付宝小程序,用微信和支付宝扫同一个普通二维码,支付宝扫码进入支付宝小程序指定页面,微信扫码进入微信小程序的指定页面。解决办法: 微信公众平台和支付宝开放平台都有自己的二维码配置规则。配置相同的规则,然后用配置的二维码地址加上参数,用草料…

重温Elasticsearch

什么是 Elasticsearch &#xff1f; Elasticsearch (ES) 是一个基于 Lucene 构建的开源、分布式、RESTful 接口全文搜索引擎。还是一个分布式文档数据库&#xff0c;其中每个字段均是被索引的数据且可被搜索&#xff0c;它能够扩展至数以百计的服务器存储以及处理PB级的数据。它…

unity之中级工程师

主要是实际操作。 Destroy(游戏对象)&#xff1a;会真正销毁游戏对象。 动态链接库 热更新&#xff1a;用户不需要更新整个项目&#xff0c;只需要更新需要更新的部分&#xff0c;使用AssetBundle。PC,Android可以使用逻辑热更新&#xff0c;将脚本利用反射打包成一个动态链接库…

芝麻信用综合评估未通过,请选择商户支持的其他方式使用服务

如题&#xff1a;公司小程序发布上线的时候报这个错&#xff0c;因为在测试接口的时候都是可用的&#xff0c;发布上线之后不行了&#xff0c;官方的案例及解决方案地址是&#xff1a;点击链接 给出的大致原因如下&#xff1a; 因为在测试接口时能正常使用&#xff0c;所以排除…

elasticsearch集群搭建-windows

1、下载elasticsearch到本地并解压 下载地址&#xff1a; https://www.elastic.co/cn/downloads/elasticsearch 解压之后复制两份&#xff0c;node1当作主节点&#xff0c;node2、node3当作从节点 2、修改主节点配置文件 而我们只需要修改 /config 目录下的 elasticsearch.yml …

vue如何新建一个项目(超详细哦--转)

原文链接 vue创建项目&#xff08;npm安装→初始化项目&#xff09; 第一步npm安装 首先&#xff1a;先从nodejs.org中下载nodejs 双击安装&#xff0c;在安装界面一直Next 直到Finish完成安装。 打开控制命令行程序&#xff08;CMD&#xff09;,检查是否正常 使用淘宝NPM …

传统ELK分布式日志收集的缺点?

传统ELK图示&#xff1a; 单纯使用ElK实现分布式日志收集缺点&#xff1f; 1、logstash太多了&#xff0c;扩展不好。 如上图这种形式就是一个 tomcat 对应一个 logstash&#xff0c;新增一个节点就得同样的拥有 logstash&#xff0c;可以说很浪费了。 2、读取IO文件&#xff0…

微信支付分开发流程

公司要用支付分信用免押功能&#xff0c;于是着手开发。 首先要与微信的技术人员对接&#xff0c;申请支付分功能&#xff0c;申请成功之后&#xff0c;会给商户发送服务ID&#xff1b;等1到3个工作日内自行登录商户平台查看是否有开通成功&#xff0c;如果3个工作日依旧没有支…

运行银联支付系统demo

1、Demo下载 下载地址&#xff1a;https://open.unionpay.com/tjweb/acproduct/list?apiservId448 2、导入项目 注意&#xff1a;非maven项目&#xff0c;在导入idea、或者eclipse时请留意导入方式 3、修改配置 acp_sdk.properties 将backUrl、frontUrl修改为外网可访问的路径…

结对编程收获

结对编程收获 ——我和我的伙伴分到了Core组&#xff0c;他负责生成编写四则运算表达式函数&#xff0c;而我负责编写计算函数以及整体框架和接口 这一次结对编程不仅学到了不少编程技术&#xff0c;更在交流合作中发现了自己以往的问题&#xff0c;因为我一直以来是一个偏爱独…

Springboot整合ActiveMQ发送邮件

虽然ActiveMQ以被其他MQ所替代&#xff0c;但仍有学习的意义&#xff0c;本文采用邮件发送的例子展示ActiveMQ 文章目录1. 生产者1.1 引入maven依赖1.2 application.yml配置1.3 创建配置类ConfigQueue1.4 创建生产者类Producer1.5 启动类AppProducer2. 消费者2.1 引入maven依赖…