单点登录(SSO)-- 实现单点登录的几种方式

article/2025/10/4 19:26:43

1.为什么需要单点登录

三个角度:
1.1 方便用户的使用:用户登录一次,可以使用不同的服务和页面,省了忘记密码的痛苦1.2 简化开发:'SSO'让开发人员只要开发一个通用的身份验证框架,就不用为身份验证操心了1.3 方便管理:
如果应用程序加入了单点登录协议,管理用户帐号的负担就会减轻。简化的程度取决于应用程序,因为
SSO 只处理身份验证。所以,应用程序可能仍然需要设置用户的属性(比如访问特权)。

2.单点登陆的来源

2.1早期的单机部署:web单系统应用早期开发web应用都是所有的包放在一起打成一个war包放入tomcat容器来运行的。
所有的功能和业务:后台管理,门户界面的等,	都是由这一个war来支持的。
这样的单应用,也称之为巨石应用,因为十分不好扩展和拆分。在巨石应用下,用户的登录以及权限就显得十分简单。用户登录成功后,把相关信息放入会话中。
HTTP维护这个会话,再每次用户请求服务器的时候来验证这个会话即可,大致可以用下图来表示:

在这里插入图片描述

验证登录的这个会话就是session,维护了用户状态,也就是所谓的HTTP有状态协议,
我们经常可以在浏览器中看到JSESSIONID,这个就是用来维持这个关系的key。
2.2分布式集群部署:
由于网站的访问量越来也大,单机部署已经是巨大瓶颈,所以才有了后来的分布式集群部署。例如:如果引入集群的概念,1单应用可能重新部署在3台tomcat以上服务器,使用nginx来实现反向代理。
此时,这个session就无法在这3台tomcat上共享,用户信息会丢失,所以不得不考虑多服务器之间的session同步问
题,这就是单点登陆的来源。

在这里插入图片描述

3、单点登陆的实现方式

加粗样式

a.使用cookie作为媒介,存放用户凭证。 用户登录父应用之后,应用返回一个加密的cookie.
b.当用户访问子应用的时候,携带上这个cookie,授权应用解密cookie并进行校验,校验通过则登录当前用户。
c.不难发现以上方式把信任存储在客户端的Cookie中,这种方式很容易令人质疑:- Cookie不安全 - 不能跨域实现免登对于第一个问题,通过加密Cookie可以保证安全性,当然这是在源代码不泄露的前提下。
如果Cookie的加密算法泄露,攻击者通过伪造Cookie则可以伪造特定用户身份,这是很危险的。
**2.分布式session方式实现单点登录**
例如阿里有很多系统分割为多个子系统,独立部署后,不可避免的会遇到会话管理的问题,
类似这样的电商网站一般采用分布式Session实现。进一步可以根据分布式Session,建立完善的单点登录或账户管理系统。流程运行:
(1) 用户第一次登录时,将会话信息(用户Id和用户信息),比如以用户IdKey,写入分布式Session;
(2) 用户再次登录时,获取分布式Session,是否有会话信息,如果没有则调到登录页;
(3) 一般采用Cache中间件实现,建议使用Redis,因此它有持久化功能,方便分布式Session宕机后,可以从持久化存储中加载会话信息;
(4) 存入会话时,可以设置会话保持的时间,比如15分钟,超过后自动超时;结合Cache中间件,实现的分布式Session,可以很好的模拟Session会话。

在这里插入图片描述

4. 单点登录技术方案(Spring security Oauth2)

分布式系统要实现单点登录,通常将认证系统独立抽取出来,并且将用户身份信息存储在单独的存储介质,比如: MySQL、Redis,考虑性能要求,通常存储在Redis中,如下图:
在这里插入图片描述
Java中有很多用户认证的框架都可以实现单点登录:

 1Apache Shiro. 2、CAS 3Spring security   

4.1 Spring security Oauth2认证解决方案

Spring security 是一个强大的和高度可定制的身份验证和访问控制框架,集成了Oauth2协议>
下图是项目认证架构图:

在这里插入图片描述

1、用户请求认证服务完成认证。2、认证服务下发用户身份令牌,拥有身份令牌表示身份合法。3、用户携带令牌请求资源服务,请求资源服务必先经过网关。4、网关校验用户身份令牌的合法,不合法表示用户没有登录,如果合法则放行继续访问。5、资源服务获取令牌,根据令牌完成授权。6、资源服务完成授权则响应资源信息。

在这里插入图片描述
实际认证功能流程图如下
在这里插入图片描述
执行流程:

1、用户登录,请求认证服务 
2、认证服务认证通过,生成jwt令牌,将jwt令牌及相关信息写入Redis,并且将身份令牌写入cookie()
3、用户访问资源页面,带着cookie到网关 
4、网关从cookie获取token,并查询Redis校验token,如果token不存在则拒绝访问,否则放行 
5、用户退出,请求认证服务,清除redis中的token,并且删除cookie中的token 

使用redis存储用户的身份令牌有以下作用:

1、实现用户退出注销功能,服务端清除令牌后,即使客户端请求携带token也是无效的。 
2、由于jwt令牌过长,不宜存储在cookie中,所以将jwt令牌存储在redis,由客户端请求服务端获取并在客户端存储。

认证服务需要实现的功能如下:

1、登录接口
前端post提交账号、密码等,用户身份校验通过,生成令牌,并将令牌存储到redis。 将令牌写入cookie。2、退出接口 校验当前用户的身份为合法并且为已登录状态。 将令牌从redis删除。 删除cookie中的令牌

在这里插入图片描述

4.2 Jwt令牌

JSON Web Token(JWT)是一个开放的行业标准(RFC 7519)
它定义了一种简介的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。
JWT可以使用HMAC算法或使用RSA的公 钥/私钥对来签名,防止被篡改。

官网:https://jwt.io/
标准:https://tools.ietf.org/html/rfc7519

JWT令牌的优点:
1、jwt基于json,非常方便解析。 
2、可以在令牌中自定义丰富的内容,易扩展。 
3、通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。 
4、资源服务使用JWT可不依赖认证服务即可完成授权。缺点:
1、JWT令牌较长,占存储空间比较大。    

4.21令牌结构

JWT令牌由三部分组成,每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzz
1.Header:
头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)
一个例子如下:
下边是Header部分的内容
{"alg": "HS256","typ": "JWT"
}
将上边的内容使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分.
Payload:
第二部分是负载,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比 如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。最后将第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分。一个例子:
{"sub": "1234567890","name": "456","admin": true
}
Signature
第三部分是签名,此部分用于防止jwt内容被篡改。这个部分使用base64url将前两部分进行编码,编码后使用点(.)连接组成字符串,最后使用header中声明 签名算法进行签名。一个例子:
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)
base64UrlEncode(header):jwt令牌的第一部分。base64UrlEncode(payload):jwt令牌的第二部分。secret:签名所使用的密钥。

4.22 生成私钥公钥

JWT令牌生成采用非对称加密算法
1、生成密钥证书 下边命令生成密钥证书,采用RSA 算法每个证书包含公钥和私钥

keytool -genkeypair -alias changgou -keyalg RSA -keypass changgou -keystore changgou.jks -storepass changgou 

Keytool 是一个java提供的证书管理工具

-alias:密钥的别名 
-keyalg:使用的hash算法 
-keypass:密钥的访问密码 
-keystore:密钥库文件名,changgou.jks保存了生成的证书 
-storepass:密钥库的访问密码 

查询证书信息:

keytool -list -keystore changgou.jks

2、导出公钥
openssl是一个加解密工具包,这里使用openssl来导出公钥信息。

安装 openssl:http://slproweb.com/products/Win32OpenSSL.html
配置openssl的path环境变量,cmd进入changgou.jks文件所在目录执行如下命令:

keytool -list -rfc --keystore changgou.jks | openssl x509 -inform pem -pubkey

在这里插入图片描述
下面段内容是公钥

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvFsEiaLvij9C1Mz+oyAm
t47whAaRkRu/8kePM+X8760UGU0RMwGti6Z9y3LQ0RvK6I0brXmbGB/RsN38PVnh
cP8ZfxGUH26kX0RK+tlrxcrG+HkPYOH4XPAL8Q1lu1n9x3tLcIPxq8ZZtuIyKYEm
oLKyMsvTviG5flTpDprT25unWgE4md1kthRWXOnfWHATVY7Y/r4obiOL1mS5bEa/
iNKotQNnvIAKtjBM4RlIDWMa6dmz+lHtLtqDD2LF1qwoiSIHI75LQZ/CNYaHCfZS
xtOydpNKq8eb1/PGiLNolD4La2zf0/1dlcr5mkesV570NxRmU1tFm8Zd3MZlZmyv
9QIDAQAB
-----END PUBLIC KEY-----

将上边的公钥拷贝到文本public.key文件中,合并为一行,可以将它放到需要实现授权认证的工程中。


http://chatgpt.dhexx.cn/article/YeDJLGdx.shtml

相关文章

面试系列:单点登录的知识(一)

大家好,我是车辙,由于目前接手的业务涉及到了单点登录,所以一直在疯狂的去补充这方面的知识。也写下了这篇面试形式的文章,写的不好大家轻点 Diss。 面试开始 在焦急的等待中,一位看上去比较年轻的小伙子走了过来。我…

单点登录实现的几种方式及原理【单点登录】

文章目录 一、什么是单点登录二、单点登录原理三、单点登录实现方式1.基于CookieRedis的单点登录2.分布式session方式实现单点登录3.token验证4.session广播5.CAS 中央认证服务 一、什么是单点登录 单点登录的英文名叫做:Single Sign On(简称SSO&#x…

什么是单点登录?怎么样实现单点登录

单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例如…

什么是单点登录

一、什么是单点登录? 单点登录的英文名叫做:Single Sign On(简称SSO)。 在初学/以前的时候,一般我们就单系统,所有的功能都在同一个系统上。 后来,我们为了合理利用资源和降低耦合性&#xff…

什么是单点登录?单点登录的三种实现方式

单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例如…

什么是单点登录(SSO)?单点登录(SSO)到底什么意思?【附逻辑Demo实例】

在程序开发中,特别是网站类开发,会接触到单点登录(SSO),什么是单点登录?,单点登录(SSO)有什么用?下面软币网小编来来介绍一下: 一、什么是单点登录? 单点登录的英文名叫做&#xf…

分布式系统服务单点问题的探讨

分布式系统服务单点问题的探讨 无状态服务的单点问题有状态服务的单点问题 在分布式系统中,单点问题是一个比较常见的问题,对于单点问题可以分为有状态服务的单点问题和无状态服务的单点问题。 无状态服务的单点问题 对于无状态的服务,单点问…

08-微服务版单点登陆系统(SSO)实践

文章目录 单点登陆系统简介背景分析单点登陆系统概述单点登陆系统解决方案设计 单点登陆系统初步设计服务设计工程结构设计 SSO父工程创建及初始化创建父工程父工程pom文件初始配置 系统基础服务工程设计及实现业务描述表结构设计工程数据初始化创建系统服务工程并初始化Pojo对…

IDEA同时打开多个项目之解决方法

对于我们开发人员来说,有时想在一个窗口中打开多个项目,这时打开新项目时只有两个选项: 覆盖本窗口项目/在新窗口打开 解决方法: 1、点击左上角 File--->Project Structure: 2、然后选择Modules这一栏&#xff0c…

idea一个工作空间打开多个项目

很多时候,多个项目之间并不是parent和module的关系,如果不是parent和module的关系,idea一个工作空间只能打开一个项目,这样的话,如果有多个项目,来回切换视图让人烦不胜烦。下面介绍个在idea一个工作空间打…

Idea打开多个项目文件时,不自动识别maven项目

问题描述 idea打开多个项目文件(直接打开的多个项目的文件夹),却没有识别出maven项目。网上查阅,解决方案为: 选中项目的pom.xml文件,右键-" add as maven project"。 但由于项目过多,不方便一个…

idea在一个窗口打开多个项目

1、.将两个项目或多个项目放在同一个文件夹下(等同于eclipse中将多个项目放在工作空间workspace下),lz在D盘下创建了ideaCloudProject文件夹,并在该文件夹下创建了一个cloud项目和一个vue项目,如下图: 2、用idea打开该…

一个IDEA界面如何同时打开多个项目

第一步:先导入其中一个工程 第二步:点击File->Project Structure 第三步:导入模块 最后点击Apply即可完成一个IDEA界面同时打开多个项目的需求。

怎么在IDEA的一个窗口中打开多个项目

之前一直使用的是sts,最近比较有空,学习一下idea的使用。 习惯了eclipse,myeclipse,sts等工具,想在一个窗口管理多个项目,只用import就可以了。但今天使用Intellij IDEA时,新建了一个工程,然后我又想从github上把我以前…

IDEA中如何在一个窗口中打开多个项目

idea在一个窗口如何打开多个项目 在使用Spring进行微服务开发时,需要同时打开很多个项目,但是如果每一个项目都单独一个窗口的话,切换就很麻烦,最方便的就是在IDEA一个窗口中管理多个项目。 在IDEA之中,它的一个项目就…

idea同时打开多个项目

想在idea中同时打开多个项目,如下图 打开项目后一般无法识别多个文件,可以按照下面的步骤操作 查看项目中maven插件是否打开 查看maven是否配置 查看右侧是否有maven选项,如果没有就先添加maven选项,添加方案步骤提供下面三种方…

使用IDEA打开eclipse项目

文章目录 点击左上角的File→New→Project from Existing Sources。 选择到要打开的项目路劲,选择好后点击OK 先勾选 Import project from external model 后选择Eclipse后点击Next。 无需设置,直接点击Next。 继续点击Next。 继续Next。 选择运行项目的…

idea关闭多个项目合并在tab栏显示

macos bigsur使用新版idea 2021.2 打开多个项目合并到tab栏: 对于屏幕比较小多了一行感觉比较别扭,以及全屏下暂时没适应……好几次都感觉找不到桌面…… 关闭:这个关闭是mac级别的关闭,并不是idea的setting macos - 系统偏好 …

IDEA设置多窗口打开项目

问题: 解决IDEA打开项目总是在当前窗口下,无法同事打开两个窗口的问题。【可能是我自己默认配置的问题】 解决: 菜单栏File,进入Setting栏 如上图所示,配置即可~~ 转载于:https://www.cnblogs.com/hyc-ana/p/9187153.h…

【Mac】在Idea中打开两个项目在同一个窗口

前置条件: 打开两个项目在不同窗口 步骤: 1.选择一个窗口上的window(窗口)选项。 2.选择Merge All Project Windows(合并所有项目窗口) 效果: 注意事项: 一定要打开多个项目&am…