SSO单点登录 - 多系统,单一位置登录,实现多系统同时登录 学习笔记

news2025/1/12 19:06:15

(1)单点登录

多系统的前提下,单一位置的登录,会实现多系统同时登录的一种技术。

常出现在互联网应用和企业级平台中

如:京东

单点登录一般是用于互相授信的系统,实现单一位置登录,全系统有效的。

注意:三方登录:某系统使用其他系统的用户实现本系统登录的方式。这不是单点登录,是解决信息孤岛和用户不对等的实现方案。

(2)Session跨域

所谓Session跨域就是摒弃了系统(tomcat)提供的Session,而使用自定义的类似 Session 的机制来保存客户端数据的一种解决方案。

如:通过设置 cookie 的 domain 来实现 cookie 的跨域传递。在 cookie 中传递一个自定义 的 session_id。这个 session_id 是客户端的唯一标记。将这个标记作为 key,将客户端需要保存的数据作为 value,在服务端进行保存(数据库保存或 NoSQL 保存)。这种机制就是 Session 的跨域解决。

什么是跨域:客户端请求的时候,请求的服务器,不是同一个IP,端口,域名,主机号的时候,都称跨域。

什么是域:在应用模型中,一个完整的,有独立访问路径的功能集合称为一个域。如:百度称为一个应用或系统。百度下有若干的域,如搜索引擎(www.baidu.com),百度贴吧(tie.baidu.com),百度知道(zhidao.baidu.com),百度地图(map.baidu.com)等。域信息,有时也称为多级域名。域的划分:以IP,端口,域名,主机名为标准实现划分。

(3)Spring Session共享(了解即可)

spring-session 技术是 spring 提供的用于处理集群会话共享的解决方案。spring-session 技术是将用户 session 数据保存到三方存储容器中,如:mysql,redis 等。

Spring-session 技术是解决同域名下的多服务器集群 session 共享问题的。不能解决跨域 session 共享

使用:配置一个Spring提供的Filter,实现数据的拦截保存,并转换为Spring-session需要的会话对象。必须提供一个数据库的表格信息(由Spring-session提供)。

(4)Nginx Session共享(了解即可)

正向代理:对客户端已知,对服务端透明的代理应用,称为正向代理。如:翻墙软件。

反向代理:对服务端已知,对客户端透明的代理应用,称为反向代理。如:nginx。

nginx:做反向代理服务器,可以为反向代理的服务器集群做集群管理和负载均衡。

Nginx服务器一旦安装,一般提供7*24小时服务。建议安装在服务器中(如:Unix、Linux)

Nginx是一个C语言开发的应用服务器。可以提供的服务有:静态WEB服务,邮件代理服务器,反向代理服务器。

Nginx应用体积非常的小,对CPU和内存的要求也很低。且对负载能力有非常好的体现。核心功能是应用自主开发,很多的附属功能都是借助其它的应用实现的。如:SSL协议的解析-opensll,perl库(正则)的解析-perl包实现。

nginx 中的 ip_hash 技术能够将某个 ip 的请求定向到同一台后端,这样一来这个 ip 下的 某个客户端和某个后端就能建立起稳固的 session,ip_hash 是在 upstream 配置中定义的,具 体如下:

upstream nginx.example.com
{
	server 127.0.0.1:8080;
	server 127.0.0.1:808;
	ip_hash;
}
server
{
	listen 80;
	location /
	{
		proxy_pass
		http://nginx.example.com;
		proxy_set_header Host $http_host;
		proxy_set_header Cookie $http_cookie;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 100m;
	}
}

ip_hash 是容易理解的,但是因为仅仅能用 ip 这个因子来分配后端,因此 ip_hash 是有 缺陷的,不能在一些情况下使用:

nginx 不是最前端的服务器。

ip_hash 要求 nginx 一定是最前端的服务器,否则 nginx 得不到正确 ip,就不能根据 ip 作 hash。譬如使用的是 squid 为最前端,那么 nginx 取 ip 时只能得到 squid 的服务器 ip 地址, 用这个地址来作分流是肯定错乱的。

nginx 的后端还有其它方式的负载均衡。

假如 nginx 后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端 的请求肯定不能定位到同一台 session 应用服务器上。

(5)token机制(最常用)

1>传统身份认证

HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名和密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录, 这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端 收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个Cookie 里的信息,看看能不能在服务端这 里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给 客户端。

上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。

这种认证中出现的问题是:

Session:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。

可扩展性:在服务端的内存中使用 Session 存储登录信息,伴随而来的是可扩展性问题。

CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会 是一个让人头疼的问题。在使用 Ajax 抓取另一个域的资源,就可以会出现禁止请求的情况。

CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击, 并且能够被利用其访问其他的网站。

在这些问题中,可扩展性是最突出的。因此我们有必要去寻求一种更有行之有效的方法。

2>Token身份认证

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

客户端使用用户名、密码请求登录

服务端收到请求,去验证用户名、密码

验证成功后,服务端会签发一个Token,再把这个Token 发送给客户端

客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里

客户端每次向服务端请求资源的时候需要带着服务端签发的 Token

服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

使用 Token 验证的优势:

无状态、可扩展

在客户端存储的 Tokens 是无状态的,并且能够被扩展。基于这种无状态和不存储 Session 信息,负载均衡器能够将用户信息从一个服务传到其他服务器上。

安全性

请求中发送 token 而不再是发送 cookie 能够防止 CSRF(跨站请求伪造)。即使在客户端使用 cookie 存储 token,cookie 也仅仅是一个存储机制而不是用于认证。不将信息存储在 Session 中,让我们少了对 session 操作。

(6)Json Web Token(JWT)机制(广泛使用)

JWT 是一种紧凑自包含的,用于在多方传递 JSON 对象的技术。传递的数据可以使用 数字签名增加其安全性。可以使用 HMAC 加密算法或 RSA 公钥/私钥加密方式,即对称加密和非对称加密。

紧凑:数据小,可以通过 URL,POST 参数,请求头发送。且数据小代表传输速度快。

自包含:使用 payload 数据块记录用户必要且不隐私的数据,可以有效的减少数据库访问次数,提高代码性能。

JWT 一般用于处理用户身份验证数据信息交换

用户身份验证:一旦用户登录,每个后续请求都将包含 JWT,允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。

数据信息交换:JWT 是一种非常方便的多方传递数据的载体,因为其可以使用数据签名来保证数据的有效性和安全性。

1.JWT数据结构

JWT 的数据结构是 : A.B.C。 由字符点 ‘ . ’ 来分隔三部分数据。

A - header 头信息

B - payload (有效荷载,用户的非隐私数据,减少数据库访问)

C - Signature 签名(安全性保证)

1.1header

数据结构: {“alg”: “加密算法名称”, “typ” : “JWT”}

alg 是加密算法定义内容,如:HMAC SHA256 或 RSA

typ 是 token 类型,这里固定为 JWT

1.2payload

可省略,但可省略的仅仅是数据,也就是说它一定有只是可以为空。

在 payload 数据块中一般用于记录实体(通常为用户信息)或其他数据的。主要分为三个部分,分别是:已注册信息(registered claims),公开数据(public claims),私有数据(private claims)。

payload 中常用信息有:iss(发行者),exp(到期时间),sub(主题),aud(受众)等。 前面列举的都是已注册信息。

公开数据部分一般都会在 JWT 注册表中增加定义。避免和已注册信息冲突

公开数据和私有数据可以由程序员任意定义。

注意:即使 JWT 有签名加密机制,但是 payload 内容都是明文记录,除非记录的是加密数据,否则不排除泄露隐私数据的可能。不推荐在 payload 中记录任何敏感数据。

1.3Signature

签名信息。这是一个由开发者提供的信息。是服务器验证的传递的数据是否有效安全的标准。在生成 JWT 最终数据的之前。先使用 header 中定义的加密算法,将 header 和 payload进行加密,并使用点进行连接。如:加密后的head.加密后的 payload。再使用相同的加密算法,对加密后的数据和签名信息进行加密。得到最终结果。

((A加密).(B加密))加密 —>C

2.JWT执行流程

借助浏览器,否则JWT流程难以实现。

在这里插入图片描述

(7)基于JWT机制的单点登录

1.实现

https://blog.csdn.net/weixin_51304175/article/details/123964266

重新生成token,就是为了更新token的有效期。

2.注意

使用 JWT 实现单点登录时,需要注意 token 时效性。token 是保存在客户端的令牌数据, 如果永久有效,则有被劫持的可能。token 在设计的时候,可以考虑一次性有效或一段时间内有效。如果设置有效时长,则需要考虑是否需要刷新 token 有效期问题。

3.token保存位置

使用 JWT 技术生成的 token,客户端在保存的时候可以考虑 cookie 或 localStorage。cookie 保存方式,可以实现跨域传递数据,但可能会被劫持。localStorage 是域私有的本地存储,无法实现跨域。

4.webstorage

webstorage 可保存的数据容量为 5M。且只能存储字符串数

webstorage 分为 localStorage 和 sessionStorage。

localStorage 的生命周期是永久的,关闭页面或浏览器之后 localStorage 中的数据也不会 消失。localStorage 除非主动删除数据,否则数据永远不会消失。

sessionStorage 是会话相关的本地存储单元,生命周期是在仅在当前会话下有效。 sessionStorage 引入了一个“浏览器窗口”的概念,sessionStorage 是在同源的窗口中始终存在 的数据。只要这个浏览器窗口没有关闭,即使刷新页面或者进入同源另一个页面,数据依然存在。但是 sessionStorage 在关闭了浏览器窗口后就会被销毁。同时独立的打开同一个窗口 同一个页面,sessionStorage 也是不一样的。

(8)Restful接口设计

1.Rest 简述

REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种 Web 服务交互方案中,REST 相比于 SOAP(Simple Object Access protocol,简单对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的 处理还是对 Payload 的编码,REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的 是 REST 并没有一个明确的标准,而更像是一种设计的风格

2.Restful 简述

对应的中文是 rest 式的;Restful web service 是一种常见的 rest 的应用,是遵守了 rest 风格的 web 服务;rest 式的 web 服务是一种 ROA(The Resource-Oriented Architecture)(面向服务资源的架构).

3.Restful 特性

3.1普通架构

每次请求的接口或者地址,都在做描述,例如查询的时候用了 query,新增的时候用了 save。如:

http://127.0.0.1/user/query/1 GET 根据用户 id 查询用户数据

http://127.0.0.1/user/save POST 新增用户

3.2Restful 架构

使用 get 请求,就是查询.使用 post 请求,就是新增的请求,意图明显,没有必要做描述, 这就是 restful。

http://127.0.0.1/user/1 GET 根据用户 id 查询用户数据

http://127.0.0.1/user POST 新增用户

3.3Restful 操作方式

在这里插入图片描述

幂等性:多次访问,结果资源状态是否相同

安全:访问是否会变更服务器资源状态

3.4响应状态码

在这里插入图片描述

4.SpringMVC 使用 Restful 实例

(9)接口安全机制

在对外发布服务接口的时候,定制一套签名机制,保证数据传递有效性的。

1.DES加密

2.AES加密

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

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

相关文章

我看ChatGPT

ChatGPT出现后惊喜或惊醒了很多人。惊喜是因为没想到大型语言模型(LLM,Large Language Model)效果能好成这样;惊醒是顿悟到我们对LLM的认知及发展理念,距离世界最先进的想法,差得有点远。我属于后知后觉的那批人&#…

ubuntu 使用 adb 工具卸载鸿蒙系统预装软件

准备工作 打开 USB 调试 进入 “设置->关于手机” 连续点击版本号, 直到有提示开启了"开发人员选项" 进入 “设置->系统和更新->开发人员选项”, 打开 USB 调式, 顺便可以把"自动系统更新"关了 下载 adb 工具 官方地址: https://developer.an…

打通数据价值链,百分点数据科学基础平台实现数据到决策的价值转换 | 爱分析调研

随着企业数据规模的大幅增长,如何利用数据、充分挖掘数据价值,服务于企业经营管理成为当下企业数字化转型的关键。 如何挖掘数据价值?企业需要一步步完成数据价值链条的多个环节,如数据集成、数据治理、数据建模、数据分析、数据…

CoreData + CloudKit 支持的 App 在导出(export)新建托管对象时内存飙升导致被杀死的解决

问题现象 CoreData + CloudKit 支持的 App 在新建托管对象并同步导出到云时可能会导致进程内存疯狂增长,最终很快被系统杀死。 如果你的 App 满足以下三点,那么很可能出现这种情况: CoreData + CloudKit 支持云存储中已存入大量数据(1.5GB+)CoreData 数据结构包含若干一…

一起学习用Verilog在FPGA上实现CNN----(六)SoftMax层设计

1 SoftMax层设计 1.1 softmax SoftMax函数的作用是输入归一化,计算各种类的概率,即计算0-9数字的概率,SoftMax层的原理图如图所示,输入和输出均为32位宽的10个分类,即32x10320 本项目softmax实现逻辑为: …

计算机操作系统 左万利 第二章课后习题答案

计算机操作系统 左万利 第二章课后习题答案 1、为何引进多道程序设计,在多道程序设计中,内存中作业的道数是否越多越好?说明原因。 引入多道程序设计技术是为了提高计算机系统资源的利用率。在多道程序系统中,内存中作业的道数并…

Windows 搭建ARM虚拟机 UOS系统

搭建环境安装虚拟机下载虚拟机QEMU,https://www.qemu.org/download/,目前最新版本是7.2.0。安装完成后,需要将qemu的安装路径设置到环境变量完成后运行cmd,测试环境变量配置完成。qemu-system-aarch64 --version如上截图所示&…

【QT】QHostInfo 和 QNetworkInterface 的使用

目录1. Qt网络模块2. QHostInfo2.1 公共函数2.2 静态函数3. QNetworkInterface3.1 公共函数3.2 静态函数4. 代码示例Dialog.hDialog.cpp界面展示1. Qt网络模块 使用Qt网络模块,需要在配置文件.pro中添加: Qt network2. QHostInfo 2.1 公共函数 QLis…

10分钟学会Jmeter接口测试

一提到接口测试,通常大家会有这样的疑问:前端测试不是已经覆盖到各种业务逻辑了吗?为什么还要做接口测试,接口测试和前端测试是不是重复了?对于这个问题,可以从下面几个方面来解释: 什么是接口…

OpenMMLab AI实战营 第6课 语义分割与MMSegmentation

第6课 语义分割与MMSegmentation 1. 语义分割简介 任务:将图像按照物体的类别分割成不同的区域,等价于对每个像素进行分类应用 无人驾驶人像分割智能遥感医疗影像分析 语义分割 vs 实例分割 vs 全景分割 语义分割:仅考虑像素的类别&#xf…

如何利用火遍全球的ChatGPT搞钱?

火遍全球的ChatGPT想必大家都知道了。已经有人借助它赚到了2023年的第一桶金,连比尔盖茨都称赞ChatGPT不亚于互联网的诞生。还有人借助Chagpt通过了Google面试,拿到了年薪18万美元的工程师offer。要明白,年薪百万的谷歌程序员,对于…

百度富文本UE的问题集合

百度富文本编辑能上传视频成功但是在浏览器不能播放、显示的问题百度富文本视频封面空白问题百度富文本编辑器UMEditor 添加视频无法删除百度富文本编辑器结果存数据库取出来到js赋值报错怎么让浏览器重新加载修改过的JS文件,而不是沿用缓存里的百度富文本编辑能上传…

智慧物流管理系统

智慧物流运用物联网、大数据、云计算、人工智能等技术优化物流决策过程。智慧物流获取、分析物流信息并做出决策,从商品源开始实时跟踪与管理,保证信息流快于商品流,实现信息与物质快速、高效、流畅地运转,集自动化、数字化、网络…

浏览器如何使用HTTP防止ip限制

当我们浏览网页尤其是频发刷新网页时,会跳出来验证码。主要因为频繁刷新导致目标网页限制了您本地ip,正常过一段时间也或许恢复,如果遇到紧急的事情急需访问,不妨试试下面的操作。不管是网页还是电脑游戏都可以通过改变地址实现防…

Linux内核移植(源码分析、配置与编译)

目录 一、Linux内核概述 1.1内核与操作系统 ​编辑1.2Linux层次结构 1.3Linux内核特点 二、Linux内核源码结构 2.1Linux内核源码获取 2.2Linux内核源码结构 三、Linux内核源码的配置和编译 3.1Linux内核源码配置 3.2make menuconfig 3.3内核编译(以下命令…

Java学习记录day6

书接上回 类与对象 static关键字 static的作用: 修饰一个属性:声明为static的变量实质上就是一个全局变量,其生命周期为从类被加载开始一直到程序结束;修饰方法:无须本类的对象也可以调用该方法;修饰一个类&#x…

Yii中render和renderPartial的区别

一、Yii项目来源二、配置yiisoft/yii2-app-basic,写个Demo1、默认的首页2、自定义Demo的html内容3、php渲染代码1)、render() 渲染2)、renderPartial() 渲染三、给出结论一、Yii项目来源 直接composer安装:composer create-proje…

注意力机制(SE,ECA,CBAM) Pytorch代码

注意力机制1 SENet2 ECANet3 CBAM3.1 通道注意力3.2 空间注意力3.3 CBAM4 展示网络层具体信息1 SENet SE注意力机制(Squeeze-and-Excitation Networks):是一种通道类型的注意力机制,就是在通道维度上增加注意力机制,主要内容是是…

【光线追踪】光线追踪重投影方法(Ray Tracing Reprojection)

光线追踪重投影方法 重投影这项技术一般用于时间性帧复用技术上,例如TAA(Temporal Anti-Aliasing)反走样或者抗锯齿技术。读这篇文章最好先对TAA这类技术的算法流程有了解。 1.TAA抗锯齿技术简介 先简单介绍下TAA抗锯齿的原理,在游戏中,当前…

解决ThinkPHP5.1出现MISS缓存未命中问题

一淘模板(56admin.com)给大家带来了关于ThinkPHP5.1的相关知识,其中主要介绍了CDN是什么?为什么使用它?怎么解决ThinkPHP5.1 MISS缓存未命中问题?感兴趣的朋友下面一起来看一下吧,希望对大家有帮…