基于springboot3实现单点登录(一): 单点登录及其相关概念介绍

news2024/11/23 19:08:32

引言

应网友要求,从本文开始我们将实现一套基于springboot3+springsecurity的单点登录认证系统。

单点登录的实现方式有多种,接下来我们会以oauth2为例来介绍和实现。

单点登录介绍

单点登录(Single Sign-On,简称SSO)是一种身份验证机制,它允许用户一次登录后,在多个应用系统中无需再次输入用户名和密码就能访问。SSO的主要价值在于提高用户体验、增强安全性和简化管理。
SSO的实现通常依赖于标准协议和技术,常见的有以下几种:

SSO常见的实现方案、优缺点及其适用场景对比如下:

方案说明优缺点适用场景
基于Cookie实现优点1:简单易实现:利用HTTP Cookie进行状态维护,实现相对简单。
优点2:无状态服务:服务器不需要保存每个用户的会话状态,减轻了服务器负担。
缺点1:跨域限制:Cookie受同源策略限制,不适用于跨域场景。
缺点2:安全性问题:Cookie容易被截获或伪造,需要HTTPS等安全措施保护。
同一域名或子域名下的多个应用。
基于Session实现状态持久化:可以存储更多的用户信息,支持更复杂的会话管理。
灵活性:通过分布式Session可以支持高可用和负载均衡。
性能开销:每次请求都需要查询Session信息,增加数据库或缓存系统的负担。
跨域问题:同样受限于同源策略,不适合跨域应用。
需要存储大量会话数据的场景,且应用位于同一域名下
基于Token的实现无状态:服务器不需要保存会话状态,提高可伸缩性和安全性。
跨域支持:Token可以跨域传输,适用于微服务架构或多域名环境。
安全性:使用加密算法确保Token的安全性。
Token过期管理:需要设计合理的Token生命周期和刷新机制。
存储开销:对于大量并发用户,Token的存储和管理可能成为瓶颈。
微服务架构或涉及多域名的应用。
联邦身份认证互操作性:遵循开放标准,支持跨组织的身份验证和授权。
灵活性:支持多种认证方式和第三方身份提供商。
复杂性:实现和配置较为复杂,需要对标准协议有深入理解。
依赖外部服务:如果使用第三方身份提供商,可能存在服务不可用的风险。
要跨组织或跨平台的身份认证,如企业间合作、政府机构间的互联互通。如常见的Oauth2.0、CAS、SAML2.0等。
集中式身份管理统一管理:集中管理用户身份和权限,简化管理和审计工作。
高效性:避免了每个应用独立维护用户信息的重复工作。
单点故障:集中式服务一旦出现问题,可能影响所有依赖它的应用。
迁移成本:如果已有大量应用,迁移到集中式身份管理系统可能需要较大的工程量。
大型企业内部或组织结构复杂的应用集群,需要统一的用户管理和权限控制

OAuth2.0介绍

OAuth 2.0 是一种认证授权协议标准,有客户端模式(client_credentials)、密码模式(password)、简化模式(implicit)、授权码模式(authorization_code)、token刷新模式(refresh_token)。

介绍 OAuth 2.0 前,先介绍一下 OAuth 2.0 中涉及到的几种角色。

客户端(client):使用认证服务器作为认证渠道的平台,一般指的是第三方应用。例如,微信提供 OAuth 2.0 认证平台,我们的 APP 支持微信登录,那么我们的 APP 对于微信服务来说就是客户端。又例如,我们是政府某一平台的服务,我们平台维护的数据代表着足够高的权威,那么其他政府部门或合作方,需要从我们的平台中查询数据,或者利用我们平台的认证进行登录,那么其他部门或合作方的应用就是客户端。

资源服务器(Resource Server):简单的说,就是提供接口给客户端访问的服务器,访问资源服务器上受保护的接口,则需要带上令牌(token)。例如分布式微服务中的用户服务、订单服务等部署的服务器都属于资源服务器。

资源所有者(Resource Owner):拥有该资源的主体对象,一般指用户。客户端向资源服务器请求获取用户数据时,资源所有者参与确认授权或拒绝操作。

认证服务器(Authorization Server):对客户端和用户进行身份认证、授权的服务器,认证授权成功,则颁发令牌(token)。

客户端模式

客户端模式官网交互图如下:

oauth2_客户端模式交互图
客户端模式是拿权级别最低额且要求服务器对客户端高度信任的模式,因为客户端向认证服务器请求认证授权的过程中,自始至终都没有用户的参与,未经过用户允许,客户端凭借提供自己在认证服务器追测的信息即可在认证服务器完成认证授权,而客户端获得认证授权后,泽拥有从资源服务器操作用户数据的去厄,这种模式一般应用于公司内部系统或者有着高度保密责任的合作伙伴之间的对接,使用较多的场景是两个不同系统之间的开放API的认证。其时序图如下:
oauth2_客户端模式时序图
简要说明如下:

  1. 客户端现在认证服务器注册好户端信息
  2. 认证服务器存储维护客户端信息
  3. 客户端使用服务端分发的凭证参数:client_id、client_secret、grant_type等参数向认证服务器发起获取token的请求
  4. 认证服务器端对客户端提交的参数进行校验,验证通过则发放令牌,失败泽返回异常信息
  5. 客户端获取到令牌后,即可使用令牌访问资源服务器了。

密码模式

官网交互图如下:
oauth2_密码模式交互图
这种方式是在客户端模式的基础上使用用户的账号和密码做认证,是一种相对来说非常不安全的方式,在oauth2.1中该方式已经被废弃了,不做过多说明。

授权码模式

官网交互图如下:
oauth2_授权码模式交互图
授权码模式是 OAuth 2.0 协议中安全级别最高的一种认证模式,与密码模式类似,都需要使用到用户的账号信息在认证平台的登录操作,但有所不同的是,密码模式是要求用户直接将自己在认证平台的账号、密码提供给第三方应用(客户端),由第三方平台进行代理用户在认证平台的登录操作;而授权码模式则是用户在认证平台提供的界面进行登录,然后通过用户确认授权后才将一次性授权码提供给第三方应用,第三方应用拿到一次性授权码以后才去认证平台获取 token。

授权码模式的时序图如下:

oauth2_授权码模式时序图

时序图说明如下:

  1. 客户端首先在认证服务器注册号客户端信息
  2. 认证服务器存储维护客户端信息
  3. 用户在客户端上发起登录
  4. 向认证服务器发起授权请求,如:http://localhost:8080/oauth2/authorize?client=xxx&response_type=code&redirect_uri=https://www.baidu.com&scope=admin,user
  5. 认证服务器带上客户端参数,将操作引导至用户授权确认页面,用户在该页面进行确认操作。
  6. 用户在授权页面选择授权范围,点击确认提交,则会带上客户端参数和用户授权范围想认证服务器获取授权码
  7. 认证服务器校验客户端信息和授权范围,校验通过则将授权码拼接到客户端注册的回调地址返回给客户端
  8. 客户端拿到授权码后,带上客户端信息和授权码想认证服务器换取令牌
  9. 认证服务器验证客户端信息和授权码,如果验证通过则返回令牌,不通过则返回异常信息
  10. 客户端获取到令牌后就可以带着令牌去访问资源服务器了。

授权码是我们在日常开发中最常见的认证方式了,虽略显复杂但却能保证安全性。如我们接入企业微信、微信登录时它们提供的都是基于授权码模式的相关API。

简化模式

官网交互图如下:

oauth2_简化模式交互图
简化模式(或者叫做隐身模式)是相对于授权码模式而言的,对授权码模式的交互做了一下简化,省去了客户端使用授权码去认证服务器换取令牌的操作,及用户在代理页面选择授权范围提交确认后认证服务器通过客户端注册的毁掉地址直接给客户端返回令牌了。

其时序图如下所示:

oauth2_简化模式时序图

Refresh Token模式

官网交互图如下:

oauth2_刷新token交互图

RefreshToken模式是对access_token过期的一种补办操作,换句话说可以叫做自动续期。它在给客户端办法access_token的时候也会同时发放refresh_token,而refresh_token的有效期要远大于access_token的有效期,当客户端发现access_token过期时,客户端可以带着refresh_token向认证服务器请求一个新的access_token, 从而避免了用户的再次登录。当然如果refresh_token也过期的话是需要用户重新进行登录的。

其时序图如下:

oauth2_刷新token时序图
相对来说比较好理解,不做过多说明。

OAuth2.1介绍

Oauth2.1中去掉了密码模式、简化模式,增加了设备授权码模式,同时也对授权码模式增加了PKCE扩展,下面对Oauth2.1中的认证授权模式进行一些讲解。

客户端模式

OAuth2.0的客户端模式在OAuth2.1中被保留下来,基本流程和实现方案上与OAuth2.0中的是一致的。

授权码模式

授权码模式交互过程与OAuth2.0的是一致的,OAuth2.1版本提供了PKCE扩展。

PKCE(Proof Key for Code Exchange)是OAuth 2.1标准中推荐用于增强授权码(Authorization Code)流安全性的一个机制,特别是在处理公共客户端(public clients)时,如移动应用或JavaScript前端应用,这些客户端通常无法安全地存储客户端密钥(client secret)。PKCE通过引入临时的code_verifier和code_challenge对来防止中间人攻击和重放攻击。

在OAuth 2.1中,PKCE的流程如下:

  • 生成code_verifier: 客户端生成一个随机字符串code_verifier,这个字符串应该足够长且具有足够的熵以避免预测。
  • 计算code_challenge: 使用code_verifier并通过SHA-256哈希算法计算出code_challenge。然后,将code_challenge进行Base64URL编码。
  • 请求授权码: 在向授权服务器请求授权码时,客户端将code_challenge和code_challenge_method(通常是S256表示使用SHA-256算法)作为参数传递。
  • 验证授权码: 当客户端使用授权码换取访问令牌时,它同时发送code_verifier给授权服务器。
    授权服务器接收code_verifier并重新计算code_challenge以验证其与之前收到的code_challenge是否匹配。
  • 发放令牌: 如果code_challenge匹配,授权服务器将发放访问令牌给客户端。
    PKCE的引入使得即使客户端密钥被泄露,攻击者也无法利用截获的授权码,因为没有正确的code_verifier,他们无法通过验证过程。

在OAuth 2.1中,PKCE是强制性的,这意味着所有支持OAuth 2.1的授权服务器必须实现并支持PKCE,以确保更高的安全性。

设备授权码模式

设备授权码模式(Device Authorization Grant)是OAuth 2.1规范中定义的一种授权模式,主要用于那些没有浏览器或者输入能力有限的设备,例如智能电视、游戏机、打印机等。这种模式允许设备发起授权请求,而最终的用户认证和授权决策则在另一个设备上完成,通常是用户的智能手机或计算机。

设备授权码模式的流程如下:

  • 设备发起请求: 设备(客户端)向授权服务器发起请求,请求一个设备授权码(device code)和一个用户码(user code)。这个请求通常包含客户端ID(client ID)和可选的范围(scope)。
  • 显示用户码和授权链接: 授权服务器响应设备请求,返回一个设备授权码和一个用户码,并可能还包含一个验证URL和一个间隔时间,指示设备应多久轮询一次授权状态。设备将用户码和验证URL显示给用户。
  • 用户手动确认: 用户需要在另一个设备上访问提供的验证URL,并输入用户码,从而触发用户界面,让用户确认是否授权设备访问其账户。
  • 设备轮询: 设备开始周期性地轮询授权服务器,检查用户是否已经完成了授权。设备使用设备授权码进行轮询,直到授权完成或超时。
  • 授权完成: 当用户在验证URL上完成授权后,设备的轮询请求会成功,并返回访问令牌(access token)和刷新令牌(refresh token),设备可以使用这些令牌来访问受保护的资源。
  • 访问资源: 设备使用接收到的访问令牌向资源服务器请求访问受保护的资源。

官网交互流程图如下:

oauth2.1_设备授权码模式交互图

Refresh Token模式

该模式与oauth2.0的Refresh Token一致,不做赘述。

OpenID Connect

OpenID Connect (OIDC) 是一种基于 OAuth 2.x 的身份验证层,它允许应用程序不仅获取对资源的访问权限,还能获取有关授权用户的信息,包括但不限于用户的唯一标识符、姓名、电子邮件等。

OpenID Connect 1.0(通常简称 OIDC)是建立在 OAuth 2.x 授权协议之上的,它利用 OAuth 的授权码、隐式、密码和客户端凭证等授权模式来实现身份验证。

OIDC 的核心概念包括:

  • ID Token: OIDC 引入了 ID Token,这是一个经过数字签名的 JSON Web Token (JWT),包含了关于用户身份的声明。它通常在授权响应中返回给客户端,用于证明用户的身份,并且可以包含用户的基本信息。
  • UserInfo Endpoint: 除了 ID Token,OIDC 还定义了一个 UserInfo Endpoint,客户端可以通过访问这个端点并使用 Access Token 来获取用户的详细信息。
  • Discovery Mechanism: OIDC 引入了发现机制,允许客户端自动检测 OpenID Provider 的元数据,包括授权端点、令牌端点、用户信息端点等的URL,简化了客户端的配置过程。
  • Dynamic Client Registration: OIDC 支持动态客户端注册,允许客户端在运行时向 OpenID Provider 注册,以获取客户端ID和其他配置信息。
  • Prompt Parameters: OIDC 支持提示参数,如 prompt=login 或 prompt=consent,用于控制用户界面的行为,如强制用户重新登录或显示同意屏幕。
  • Session Management: OIDC 提供了会话管理机制,允许客户端检查用户的会话状态,确保用户在多个相关服务之间的会话一致性。
  • Scopes and Claims: OIDC 扩展了 OAuth 的范围(scopes)概念,引入了 claims,允许客户端请求特定的用户信息。
  • Logout: OIDC 定义了注销流程,允许客户端请求终止用户的会话。
    Token Introspection and Validation: OIDC 支持令牌内省和验证,允许资源服务器确认 Access Token 和 ID Token 的有效性。

通过这些特性,OpenID Connect 为基于 OAuth 2.x 的应用程序提供了一个标准化的方法来处理用户身份验证,使得开发者可以轻松地在不同服务之间实现单点登录(SSO)和身份信息共享。

总结

本文主要是对单点登录及其实现方式做了一些介绍,同时介绍了OAuth2.0和OAuth2.1中的授权模式和一些关键概念,以此来作为后续文章的理论铺垫。接下来,我将基于本文的理论结合实际代码进行完整的流程实现。

针对本文提到的各个内容有任何疑问或者建议欢迎留言评论~~~

者可以轻松地在不同服务之间实现单点登录(SSO)和身份信息共享。

总结

本文主要是对单点登录及其实现方式做了一些介绍,同时介绍了OAuth2.0和OAuth2.1中的授权模式和一些关键概念,以此来作为后续文章的理论铺垫。接下来,我将基于本文的理论结合实际代码进行完整的流程实现。

针对本文提到的各个内容有任何疑问或者建议欢迎留言评论~~~

创作不易,欢迎一键三连~~~~

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

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

相关文章

LeetCode-环形链表、环形链表 II

一、环形链表 . - 力扣(LeetCode) 判断是否有环,使用快慢指针,开始时都指向头节点,快指针每次走两部,慢指针每次走一步,如果在走的过程中,慢指针和快指针相同(也就是快指…

STM32第九课:STM32-基于标准库的42步进电机的简单I/O控制(附电机教程,看到即赚到)

一:步进电机简介 步进电机又称为脉冲电机,简而言之,就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩,步进电机的角位移量与输入的脉冲个数严格成正比…

从Mac电脑硬盘驱动器恢复数据的3种方法[终极指南]

如果您的MacBook的启动磁盘损坏,并且您没有另一台Mac来安装恢复软件并恢复数据,该怎么办?相反,您随身携带的是 Windows 操作系统。 起初,您可能会陷入僵局,因为您无法启动到Mac并使用Mac恢复软件恢复数据&…

移动UI:具备什么特征,可以被认定为科技风格。

移动UI设计在科技风格上通常具备以下特征: 1. 清晰简洁的排版: 科技风格的移动UI通常采用清晰简洁的排版,注重信息的层次感和结构化,以便用户能够快速、直观地获取所需信息。 2. 几何形状和线条: 科技风格的移动UI常…

【大模型书籍】从零开始大模型开发与微调:基于PyTorch与ChatGLM(附PDF)

哈喽各位&#xff0c;今天又来给大家分享大模型学习书籍了&#xff0c;今天是这本<从零开始大模型开发与微调&#xff1a;基于PyTorch与ChatGLM 书籍PDF分享>&#xff0c;大模型是深度学习自然语言处理皇冠上的一颗明珠&#xff0c;也是当前AI和NLP研究与产业中最重要的方…

移动UI:任务中心的作用,该如何设计更合理?

任务中心是移动应用中用于展示和管理用户待办任务、提醒事项、用户福利、打卡签到等内容的功能模块。合理设计任务中心可以提升用户体验和工作效率。 以下是一些设计任务中心的合理建议&#xff1a; 1. 易于查看和管理&#xff1a; 任务中心的设计应该使用户能够快速、直观地…

python基础知识点(蓝桥杯python科目个人复习计划69)

做些基础题 第一题&#xff1a;微生物增值 题目描述&#xff1a; 假设有两种微生物x和y。 x出生后每隔3分钟分裂一次&#xff08;数目加倍&#xff09;&#xff0c;y出生后每隔2分钟分裂一次&#xff08;数目加倍&#xff09;。 一个新出生的x&#xff0c;半分钟之后吃掉一…

STM32学习(1)--STM32介绍

STM32介绍 1.STM32简介2.ARM3.STM32F103C8T64.外设5.命名规则6.系统结构7.引脚定义8.启动配置9.最小系统电路 课程知识及代码来源均来自b站 江协科技&#xff0c;下学期即将做毕设&#xff0c;需要用到STM32单片机&#xff0c;在这个假期我将持续学习相关知识 1.STM32简介 ST…

免费压缩归档助手,一键搞定你的文件烦恼!

在这个数字化时代&#xff0c;我们每天都在与各种文件打交道。无论是工作文档、个人照片还是珍贵的视频&#xff0c;管理这些文件成了一项必不可少的任务。但你是否还在为文件的压缩、加密和解压缩而烦恼&#xff1f;别担心&#xff0c;我们为你带来了一款方便好用的免费软件—…

如何降低老年人患帕金森病的风险?

降低老年人患帕金森病风险的方法 避免接触有害物质&#xff1a;长期接触某些化学物质、农药或其他有害物质可能会增加患帕金森病的风险。应减少这些物质的暴露&#xff0c;例如在工作或生活中采取防护措施。 健康饮食&#xff1a;均衡饮食&#xff0c;多吃富含抗氧化剂的食物&a…

Richtek立锜科技可用于智能门铃的电源管理解决方案

新型的智能门铃不仅能满足呼叫、提醒的需要&#xff0c;还能在线监控、远程操作、闯入通知、记录过程&#xff0c;系统构成相对复杂&#xff0c;与传统门铃相比有了很大的改变。 从电源管理的角度来观察&#xff0c;满足这样需求的系统构成也相对复杂&#xff1a; 处于外置状态…

HTML+CSS+JS用户管理(可储存用户数据)

使用cookies记录账号密码信息&#xff0c;可以注册、登录、注销账号。 点赞❤️收藏⭐️关注&#x1f60d; 效果图 源代码在效果图后面 源代码 HTML <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <…

Python while循环

1.while循环格式 while 表达式:循环语句 使用break结束循环。 2.例 i 0 while True:print(i)i i 1if i > 101:break 结果&#xff1a; 这段代码从0循环到100&#xff0c;到101时结束循环。

在 PostgreSQL 里如何处理数据的存储优化和查询复杂度的平衡?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何处理数据的存储优化和查询复杂度的平衡&#xff1f;一、理解数据存储优化和查询复…

网络安全保险产业发展洞察报告(2024)

数字经济高速增长&#xff0c;黑客攻击、数据泄露等网络安全风险可能直接导致企业遭受巨额的财务损失。网络安全保险作为风险转移和风险管理的有效工具&#xff0c;正逐渐成为数字安全框架中不可或缺的一环。 《网络安全保险产业发展洞察报告&#xff08;2024&#xff09;》梳…

独立站外链的数量和质量哪个更重要?

没有哪个更重要的说法&#xff0c;两者同样重要&#xff0c;很多人都有一个误解&#xff0c;认为质量才是重要的&#xff0c;质量当然重要&#xff0c;但一个网站全都是高质量的外链&#xff0c;反而会不自然&#xff0c;是极其有可能被谷歌判定为作弊外链的&#xff0c;而且这…

【python学习】标准库之文件目录访问-os.path方法和pathlib库的背景、功能、用法、代码示例和总结

引言 在Python中&#xff0c;处理文件和目录的访问有多种方式&#xff0c;其中两种最常用的方法是使用os.path模块和pathlib库 文章目录 引言一、os.path的定义二、os.path的功能2.1 路径分割和组合2.2 路径比较2.3 路径长度和组件获取2.4 路径转换2.5 路径命名 三、os.path的用…

JVM 内存介绍

本文主要介绍&#xff1a; JVM 内存分哪几个区&#xff0c;每个区的作用是什么 备注: 橙色:堆 和 方法区 &#xff0c;属于jvm公有部分,可以进行调优 灰色:java栈,本地方法栈和计数器 属于jvm的私有部分,不可进行调优 一个对象从创建到被回收的过程是怎样的? Personpnew Perso…

永磁同步电机高性能控制算法(14)—— 有源阻尼电流环

1.前言 在之前的之后中已经发过一篇复矢量电流环和我们平时用的比较多的前馈补偿的电流环的对比&#xff0c;感觉复矢量电流环的效果还是挺明显的。 https://zhuanlan.zhihu.com/p/682880365https://zhuanlan.zhihu.com/p/682880365 当时在看文献的时候&#xff0c;复矢量电…

itextpdf字体选择

itextpdf 版本7.2.5 itextpdf-html2pdf 版本4.0.5 这里讲的是通过html转pdf&#xff0c;在html2pdf中是通过html中font-family样式来确定字体的&#xff0c;那已知font-family的情况&#xff0c;怎么确定pdf中实际用的字体&#xff0c;大致分为两步&#xff1a; 1、通过font…