单点登录的三种方式

前言

在B/S系统中,登录功能通常都是基于Cookie 来实现的。当用户登录成功后,一般会将登录状态记录到Session中,或者是给用户签发一个 Token,无论哪一种方式,都需要在客户端保存一些信息(Session ID或Token),并要求客户端在之后的每次请求中携带它们。在这样的场景下,使用Cookie无疑是最方便的,因此我们一般都会将Session的ID或 Token保存到Cookie中,当服务端收到请求后,通过验证Cookie中的信息来判断用户是否登录。

单点登录(Single Sign On,SSO)是指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的应用系统。举例来说,百度贴吧和百度地图是百度公司旗下的两个不同的应用系统,如果用户在百度贴吧登录过之后,当他访问百度地图时无需再次登录,那么就说明百度贴吧和百度地图之间实现了单点登录。单点登录的本质就是在多个应用系统中共享登录状态。如果用户的登录状态是记录在Session 中的,要实现共享登录状态,就要先共享Session,比如可以将 Session序列化到Redis中,让多个应用系统共享同一个Redis,直接读取 Redis来获取 Session。当然仅此是不够的,因为不同的应用系统有着不同的域名,尽管Session 共享了,但是由于Session ID是往往保存在浏览器Cookie中的,因此存在作用或的限制,无法跨域名传递,也就是说当用户在app1.com中登录后,SessionID仅在浏览器访问app1.com时才会自动在请求头中携带,而当浏览器访问app2.com时,Session ID是不会被带过去的。实现单点登录的关键在于,如何让 Session ID(或Token)在多个域中共享。

实现方式一:父域 Cookie

在将具体实现之前,我们先来聊一聊Cookie的作用域。Cookie 的作用域由 domain属性和path 属性共同决定。domain属性的有效值为当前域或其父域的域名/IP地址,在Tomcat中,domain属性默认为当前域的域名/IP地址。path属性的有效值是以“/”开头的路径,在Tomcat 中,path属性默认为当前Web应用的上下文路径。如果将Cookie的 domain属性设置为当前域的父域,那么就认为它是父域Cookie。Cookie有一个特点,即父域中的Cookie被子域所共享,换言之,子域会自动力继承父域中的Cookie。利用Cookie的这个特点,不难想到,将SessionID(或Token)保存到父域中不就行了。没错,我们只需要将Cook ie 的 domain属性设置为父域的域名(主域名),同时将Cookie的path 属性设置为根路径,这样所有的子域应用就都可以访问到这个Cookie了了。不过这要求应用系统的域名需建立在一个共同的主域名之下,如tieba.baidu.com和map.baidu.com,它们都建立在baidu.com这个主域名之下,那么它们就可以通过这种方式来实现单点登录。
总结:此种实现方式比较简单,但不支持跨主域名。

实现方式二:认证中心

我们可以部署一个认证中心,认证中心就是一个专门负责处理登录请求的独立的 Web服务。用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将Token写入Cookie。(注意这个 Cookie是认证中心的,应用系统是访问不到的)应用系统检查当前请求有没有 Token,如果没有,说明用户在当前系统中尚未登录,那么就将页面面跳转至认证中心。由于这个操作会将认证中心的Cookie自动带过去,因此,认证中心能够根据Cookie知道用户是否已经登录过了。如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录,如果发现用户已经登录过了,就不会让用户再次登录了,而是会跳转回目标URL,并在跳转前生成一个Token,拼接在目标URL 的后面,回传给目标应用系统。应用系统拿到Token之后,还需要向认证中心确认下Token的合法性,防止用户伪造。确认无误后,应用系统记录用户的登录状态,并将 Token写入Cookie,然后给本次访问放行。(注意这个Cookie是当前应用系统的,其他应用系统是访问不到的。)当用户再次访问当前应用系统时,就会自动带上这个Token,应用系统验证Token发现用户已登录,于是就不会有认证中心什么事了。

实现方式三:LocalStorage 跨域

前面我们说实现单点登录的关键在于,如何让 Session ID(或Token)在多个域中共享。父域Cookie 确实是一种不错的解决方案,但是不支持跨域。那么有没有什么奇淫技巧能够让Cookie 跨域传递呢?很遗憾,浏览器对Cookie的跨域限制越来越严格。Chrome 浏览器还给Cookie新增了一个SameSite属性,此举几乎禁止了一切跨域请求的Cookie传递(超链接除外),并且只有当使用HTTPs协议时,才有可能被允许在AJAX跨域请求中接受服务器传来的Cookie。不过,在前后端分离的情况下,完全可以不使用Cookie,我们可以选择将Session ID(或Token)保存到浏览器的 LocalStorage中,让前端在每次向后端发送请求时,主动将LocalStorage的数据传递给服务端。这些都是由前端来控制的,后端需要做的仅仅是在用户登录成功后,将Session ID(或To oken)放在响应体中传递给前端。在这样的场景下,单点登录完全可以在前端实现。前端拿到 Session ID(或Token)后,除了将它写入自己的 LocalStorage中之外,还可以通过特殊手段将它写入多个其他域下的LocalStorage 中。关键代码如下:

在这里插入图片描述
前端通过iframe+postMessage()方式,将同一份 Token写入到了多个域下的LocalStorage中,前端每次在向后端发送请求之前,都会主动从LocalStorage 中读取 Token并在请求中携带, 这样就实现了同一份Token 被多个域所共享。
总结:此种实现方式完全由前端控制,几乎不需要后端参与

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

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

相关文章

redis-RedisTemplate.opsForGeo 的geo地理位置及实现附近的人的功能

redis内部使用的是 zset 数据结构存储,如下 import cn.huawei.VideoApplication; import cn.huawei.domain.Jingqu; import cn.huawei.service.JingquService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired…

Tkinter.Text控件中,文本存在某个关键字的将被高亮显示(标记颜色+字体加粗)

在Tkinter的Text控件中,要标记某个关键字并改变其颜色,你可以使用tag_add方法来给包含关键字的文本添加标签,然后使用tag_config方法来配置该标签的显示样式,包括前景色(字体颜色)和背景色等。以下是一个完…

云桥通+IDC数据中心:SDWAN企业组网实现高效连接案例

一、需求和背景 云桥通曾服务的一家大型跨国企业C公司,C公司多个数据中心分布在全球各地。为了实现数据共享和协作,数据中心之间需要建立稳定高效的网络连接。然而,传统的MPLS专线网络存在昂贵的成本和漫长的开通周期,无法满足企…

机器学习|线性回归

线性回归是尝试使用一条直线去拟合出图上的节点。 e i e_i ei​为第i个点构成的误差,使用平方的好处一是可以避免正负抵消,二是平方有利于放大大于1的误差的影响,同时缩小误差小于1的影响。 将平方项进行展开,以w作为变元&…

C++指针(二)

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 文章目录 1.数组指针 1.1数组指针的概念 1.2数组指针的用处 1.3数组指针的操作 1.4二维数组如何访问 1.5数组指针访问流程 1.6数组指针的练习题 2.指针数组 2.1指针数组的概念 2.2指针数组的用处 2…

ChemDraw Pro 2022:呈现专业化学绘图的极 致之作 mac/win版

PerkinElmer ChemDraw Pro 2022是一款功能强大的化学绘图软件,专为化学家、科研工作者和教育者设计。这款软件凭借其卓越的性能和丰富的功能,已经成为化学绘图领域的领导者。 PerkinElmer ChemDraw Pro 2022软件获取 ChemDraw Pro 2022提供了广泛的化学…

接口自动化测试用例如何设计,一文搞定!

说到自动化测试,或者说接口自动化测试,多数人的第一反应是该用什么工具,比如:Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀,甚至出现“ 做平台的 &…

【leetcode】反转链表

大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 方法1 .将箭头方向逆转方法2. 点击查看题目 方法1 .将箭头方向逆转 思路: n1,n2,n3分别指…

基于Python3的数据结构与算法 - 06 topk问题

一、引入 问题&#xff1a;目前共有n个数&#xff0c;设计算法得到前k大的数。&#xff08;m<n&#xff09; 解决思路&#xff1a; 排序后切片&#xff1a;O(n*lognm) O(n*logn)排序LowB三人组&#xff1a;O(mn) 例如冒泡排序&#xff0c;交换m次&#xff0c;即可取前m…

通过QScrollArea寻找最后一个弹簧并且设置弹簧大小

项目原因&#xff0c;最近需要通过QScrollArea寻找其中最后一个弹簧并且设置大小和策略&#xff0c;因为无法直接调用UI指针&#xff0c;所以只能用代码寻找。 直接上代码&#xff1a; if (m_scrollArea){int iScrollWidth m_labelSelectedTitle->width();m_scrollArea-&g…

初学HTMLCSS——盒子模型

盒子模型 盒子&#xff1a;页面中所有的元素&#xff08;标签&#xff09;&#xff0c;都可以看做是一个 盒子&#xff0c;由盒子将页面中的元素包含在一个矩形区域内&#xff0c;通过盒子的视角更方便的进行页面布局盒子模型组成&#xff1a;内容区域&#xff08;content&…

linux操作docker

docker地址 官方地址 centos7安装docker 卸载旧版本docker sudo //在前面表示以管理员权限操作yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine安装docker //安装所需资…

力扣:9. 回文数

力扣&#xff1a;9. 回文数 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&#xf…

网络安全Web Hacking 101笔记,2023年最新整理!

在计算机技术如日中天的今天&#xff0c;Web安全问题也接踵而来。但Web安全却“入门简单精通难”&#xff0c;涉及技术非常多且广&#xff0c;学习阻力很大。 为此今天分享一份94页的《Web Hacking 101》笔记&#xff0c;包含Web安全知识&#xff0c;例如HTML注入、XSS、CSRF、…

二分查找讲解

关于我为什么要写单独开一篇文章写二分,实际上那么多困难的算法,比如线段树,并查集等等都没有难倒我,我最近却被二分难倒了,而且是两次,两次在赛场上做不出来二分的应用题,于是我决定写一篇二分查找的算法总结.刚接触算法的时候本来是要写一篇的,但后面因为各种原因搁置了,现在…

前端-DOM树

dom树描述网页元素关系的一个专有名词&#xff0c;如html内包含了head、body&#xff0c;而head内包含meta、title、script等&#xff0c;body内包含div等元素&#xff1b;网页所有内容都在document里面&#xff0c;网页内容以树状形式排列&#xff0c;所以称之为dom树 dom树内…

WebCPM:首个开源的交互式网页搜索中文问答模型

论文题目&#xff1a;WEBCPM: Interactive Web Search for Chinese Long-form Question Answering   论文日期&#xff1a;2023/05/23(ACL 2023)   论文地址&#xff1a;https://arxiv.org/abs/2305.06849   GitHub地址&#xff1a;https://arxiv.org/abs/2305.06849 文章…

ChatGpt 使用fetch-event-source实现sse流式处理

microsoft/fetch-event-source 是一个由微软提供的库&#xff0c;用于在客户端和服务器之间建立基于 EventSource 的连接。EventSource 是一种 HTTP 协议&#xff0c;允许服务器向客户端推送实时事件流。该库提供了对 EventSource 协议的封装&#xff0c;使得在前端 JavaScript…

【北京迅为】《iTOP-3588开发板网络环境配置手册》第1章 网络基础知识学习

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

RabbitMQ服务启动失败

报错信息&#xff1a; 在服务中启动RabbitMQ服务显示&#xff1a; RabbitMQ 服务正在启动 . RabbitMQ 服务无法启动。 系统出错。 发生系统错误 1067。 进程意外终止 报错原因&#xff1a; 1.Erlang与RabbitMQ是否匹配 2.Erlang与RabbitMQ安装路径是否存在中文或空格 3.电…