sso简单记录

news2024/11/24 8:43:08

首先我们再次复习一下,多个系统之间为什么无法同步登录状态?

  1. 前端的Token无法在多个系统下共享。
  2. 后端的Session无法在多个系统间共享。

关于第二点,我们已在 "SSO模式一" 章节中阐述,使用 Alone独立Redis插件 做到权限缓存直连 SSO-Redis 数据中心,在此不再赘述。

而第一点,才是我们解决问题的关键所在,在跨域模式下,意味着 "共享Cookie方案" 的失效,我们必须采用一种新的方案来传递Token。

  1. 用户在 子系统 点击 [登录] 按钮。
  2. 用户跳转到子系统登录接口 /sso/login,并携带 back参数 记录初始页面URL。
    • 形如:http://{sso-client}/sso/login?back=xxx
  3. 子系统检测到此用户尚未登录,再次将其重定向至SSO认证中心,并携带redirect参数记录子系统的登录页URL。
    • 形如:http://{sso-server}/sso/auth?redirect=xxx?back=xxx
  4. 用户进入了 SSO认证中心 的登录页面,开始登录。
  5. 用户 输入账号密码 并 登录成功,SSO认证中心再次将用户重定向至子系统的登录接口/sso/login,并携带ticket码参数。
    • 形如:http://{sso-client}/sso/login?back=xxx&ticket=xxxxxxxxx
  6. 子系统根据 ticket码 从 SSO-Redis 中获取账号id,并在子系统登录此账号会话。
  7. 子系统将用户再次重定向至最初始的 back 页面。

整个过程,除了第四步用户在SSO认证中心登录时会被打断,其余过程均是自动化的,当用户在另一个子系统再次点击[登录]按钮,由于此用户在SSO认证中心已有会话存在, 所以第四步也将自动化,也就是单点登录的最终目的 —— 一次登录,处处通行。

第6步中,子系统根据 ticket码 从 SSO-Redis 中获取账号id,并在子系统登录此账号会话。详细如下:

public Object checkTicket(String ticket, String currUri) {
		SaSsoConfig cfg = SaSsoManager.getConfig();
		ApiName apiName = ssoTemplate.apiName;
		
		// --------- 两种模式 
		if(cfg.getIsHttp()) {
			// q1、使用模式三:使用 http 请求从认证中心校验ticket 
			
			// 计算当前 sso-client 的单点注销回调地址 
			String ssoLogoutCall = null; 
			if(cfg.getIsSlo()) {
				// 如果配置了回调地址,就使用配置的值:
				if(SaFoxUtil.isNotEmpty(cfg.getSsoLogoutCall())) {
					ssoLogoutCall = cfg.getSsoLogoutCall();
				}
				// 如果提供了当前 uri,则根据此值来计算:
				else if(SaFoxUtil.isNotEmpty(currUri)) {
					ssoLogoutCall = SaHolder.getRequest().getUrl().replace(currUri, apiName.ssoLogoutCall); 
				}
				// 否则视为不注册单点注销回调地址 
				else {
				}
			}
			
			// 发起请求 
			String checkUrl = ssoTemplate.buildCheckTicketUrl(ticket, ssoLogoutCall);
			SaResult result = ssoTemplate.request(checkUrl);
			
			// 校验 
			if(result.getCode() == SaResult.CODE_SUCCESS) {
				return result.getData();
			} else {
				// 将 sso-server 回应的消息作为异常抛出 
				throw new SaSsoException(result.getMsg()).setCode(SaSsoErrorCode.CODE_30005);
			}
		} else {
			// q2、使用模式二:直连Redis校验ticket 
			return ssoTemplate.checkTicket(ticket);
		}
	}

子系统拿到ticket校验的时候,需要传个client参数,标记自己是谁,避免ticket被中间人拿走用。

public Object checkTicket(String ticket, String client) {
		// 读取 loginId
		String loginId = SaManager.getSaTokenDao().get(splicingTicketSaveKey(ticket));
		
		if(loginId != null) {

			// 如果是 "a,b" 的格式,则解析出对应的 Client
			String ticketClient = null;
			if(loginId.indexOf(",") > -1) {
				String[] arr = loginId.split(",");
				loginId = arr[0];
				ticketClient = arr[1];
			}
			
			// 如果指定了 client 标识,则校验一下 client 标识是否一致 
			if(SaFoxUtil.isNotEmpty(client) && SaFoxUtil.notEquals(client, ticketClient)) {
				throw new SaSsoException("该 ticket 不属于 client=" + client + ", ticket 值: " + ticket)
					.setCode(SaSsoErrorCode.CODE_30011);
			}
			
			// 删除 ticket 信息,使其只有一次性有效
			deleteTicket(ticket);
			deleteTicketIndex(loginId);
		}
		
		// 
		return loginId;
	}

此外,一般ssoServer要记录回调的host,也就是上文的{sso-client},做个防钓鱼操作。

在SSO(Single Sign-On)认证中心回调子系统时,URL中直接携带token的确存在中间人攻击的风险。中间人攻击是指黑客截获用户与认证中心之间的通信,并伪装成用户与子系统之间的通信,从而获取用户的敏感信息或篡改数据。

为了减少中间人攻击的风险,可以采取以下措施:

  1. 使用HTTPS协议:通过使用HTTPS协议,可以确保通信过程中的数据加密,从而防止中间人窃取token等敏感信息。

  2. 对token进行签名或加密:在生成token时,可以使用签名或加密算法对其进行处理,确保token在传输过程中不被篡改或窃取。

  3. 设置token的有效期限:为token设置一个较短的有效期限,以降低被攻击的风险。在token过期后,用户需要重新进行认证。

  4. 使用防重放攻击措施:在子系统中对token进行校验时,可以使用防重放攻击的措施,如使用随机数或时间戳等方式防止token被重放。

需要注意的是,以上措施可以提高安全性,但无法完全消除中间人攻击的风险。因此,在实际应用中,还需要综合考虑其他安全措施,如使用双因素认证、IP限制等来增加系统的安全性。

可以在token上做文章,例如token是一段密文,能成功解析出用户信息就算验证通过,别人拿了token,也无法从token中解析出当前用户的登录信息。

【可以搞一个心跳cookie】

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

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

相关文章

2023-11-02 LeetCode每日一题(环和杆)

2023-11-02每日一题 一、题目编号 2103. 环和杆二、题目链接 点击跳转到题目位置 三、题目描述 总计有 n 个环,环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。 给你一个长度为 2n 的字符串 rings ,表示这 n 个环在…

Linux下使用vscode编写Python项目

我此处是使用VScode远程连接的服务器,具体方法可看如下: 1、vscode中安装Python插件 按上面步骤安装好Python插件后,重启vscode; 2、选择Python解释器 创建Python项目结构: 按下F1,打开vscode命令栏&am…

智安网络|数据库设计与规范:构建高效可靠的数据存储系统

在信息化时代,数据库设计与规范是构建高效可靠的数据存储系统的关键。一个合理的数据库设计可以提高数据的存储效率、保证数据的一致性和完整性,提供高效的数据查询和处理能力。 一、数据库设计的基本原则 数据库范式:数据库设计应符合范式的…

nmap 使用方法详细介绍

nmap的使用 前言nmap 作用Nmap使用教程 nmap的基本输入:扫描参数:端口扫描:端口状态扫描:UDP扫描协议扫描 总结 Nmap的基础知识Nmap的扫描技术 Nmap的OS检测(O)Nmap的操作系统指纹识别技术: 前…

管理类联考——英语二——考点+记忆篇——小作文

文章目录 考点整体写作结构法记忆宫殿法第一句绘图记忆法 局部第一段第二段第三段 本篇思路:根据各方的资料,比如名师的资料,按大纲或者其他方式,收集/汇总考点,即需记忆点,在通过整体的记忆法,…

PHP 字符串常用函数

PHP 字符串常用函数 字符串属性strlen 筛选查找strposstrrposstrstrstrrchr查找方法之间区别总结 拼接,拆分字符串explodestrtokimplodesubstr 替换字符串str_replace 格式化字符串trimltrimrtrim 字符串属性 strlen 获取指定字符串长度 语法: strlen (字符串变…

Transformer的Q、K、V和Mutil-Head Self-Attention(超详细解读)

目录 一.什么是Q、K、V 二.Mutil-Head Self-Attention Transformer大行其道,在众多领域取得了不可忽视的成就。如今大火的语言大模型LLM也都是基于Transformer,但是Transformer中的Q、K、V和多头注意力到底是什么呢?这里简单做个学习记录&a…

实景三维信创产品与智能硬件重磅发布 | 大势智慧2023秋季新品发布会圆满落幕

10月27日,大势智慧2023秋季新品发布会取得圆满成功。本次发布会以“全国产、真安全”为主题,重磅发布了一系列国产化软硬件产品和新型智能装备,用于满足实景三维全流程的安全生产和应用需求。大会同步在官方微信视频号、bilibili直播间进行线…

如何记录每天的工作日程?电脑手机通用的日程管理软件

在工作时间有限,但工作任务愈加繁多的现在职场中,要求每一个职场人士做好高效日程管理。通过高效管理日程,我们可以更好地组织和安排任务,合理分配时间和优先级,这有助于我们更专注地进行工作,减少时间的浪…

分析报告有样板了-奥威BI数据可视化报表模板

述职报告、月度数据分析报告、季度数据分析报告、区域数据分析报告……人在职场,数据分析报告少不了。那么,怎么才能在极短的时间内做出一张既好看又突出重点、分析逻辑在线的数据可视化分析报表?奥威BI软件的建议是采用BI数据可视化报表模板…

批量调整图片尺寸方案(比例不变)

最近又有一个问题,需要把一堆图片调整成统一的尺寸大小(例如100*100像素)。 网上或者很多工具都是直接把图片尺寸调整到对应尺寸。 这就出现了一个问题—— 整个图片会被压缩拉伸,图片里的物体/人等都变形了。 原图(200*270): 直接调整尺寸后(200*200): 我们需…

Zabbix监控原理 安装

一、监控介绍 1、监控目的 监控是需要站在公司的业务角度去考虑,而不是针对某个监控技术的使用 对系统不间断时实监控 实际上是对系统不间断的时实监控 实时反馈系统当前状态 我们监控某个硬件、或者系统,都是需要能时实看到当前系统的状态&#x…

创作者焦点:MetaLab 和 Hangar Games(第一章)

一起来看看「Dr. Bomkus 的试炼」幕后的创作故事吧~ 「创作者焦点」系列报道将带来六篇关于「Dr. Bomkus 的试炼」游戏的创作过程,以及其独特的游戏玩法和功能。请关注我们,查看更多系列内容的发布。 The Dr. Bomkus MetaLab Dr. Bomkus Meta…

基于Springboot+MYSQL+Maven实现的宠物医院管理系统(源码+数据库+运行指导文档+项目运行指导视频)

一、项目简介 本项目是一套基于springboot框架实现的宠物医院管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单…

前端基础之BOM和DOM

目录 一、前戏 window对象 window的子对象 navigator对象(了解即可) screen对象(了解即可) history对象(了解即可) location对象 弹出框 计时相关 二、DOM HTML DOM 树 查找标签 直接查找 间…

使用Qt Installer Framework将自己的程序打包成安装包程序

使用Qt Installer Framework将自己的程序打包成安装包程序 制作安装包程序就是将自己的程序打包成一个可执行的exe,双击之后进行安装。 1. 在制作安装包程序之前需要安装qt官方提供的安装包制作工具Qt Installer Framework 去qt官方网址,下载对应的 Q…

gorm的自动化工具gen

gorm的自动化工具gen 官方 https://gorm.io/zh_CN/gen/假设数据库结构如 这里使用gen-tool 安装 go install gorm.io/gen/tools/gentoollatest用法 gentool -hUsage of gentool:-c string配置文件名、默认值 “”、命令行选项的优先级高于配置文件。 -db string指定Driver…

大语言模型对齐技术 最新论文及源码合集(外部对齐、内部对齐、可解释性)

大语言模型对齐(Large Language Model Alignment)是利用大规模预训练语言模型来理解它们内部的语义表示和计算过程的研究领域。主要目的是避免大语言模型可见的或可预见的风险,比如固有存在的幻觉问题、生成不符合人类期望的文本、容易被用来执行恶意行为等。 从必…

【机器学习】四、计算学习理论

1 基础知识 计算学习理论(computational learning theory):关于通过“计算”来进行“学习”的理论,即关于机器学习的理论基础,其目的是分析学习任务的困难本质,为学习算法体统理论保证,并根据结…

2023年11月2日历史上的今天大事件早读

1082年11月02日宋徽宗出生 1861年11月02日辛酉政变 1910年11月02日中国社会学家和人类学家费孝通诞生 1910年11月02日畜生态学科的创始人汤逸人诞生 1917年11月02日《贝尔福宣言》和犹太复国主义 1917年11月02日美日订立“兰辛—石井协定”损害中国利益 1937年11月02日忻…