SSO单点登陆

article/2025/9/3 19:51:15

1 SSO简介

1.1 什么是SSO

单点登录(SingleSignOn,SSO),在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。单点登录常用的协议包括 CAS、OAuth、OpenID Connect、SAML。
例如:百度旗下有很多的产品,比如百度贴吧、百度知道、百度文库等,只要登录百度账号,在任何一个地方都是已登录状态,不需要重新登录。

第三方登陆:某系统,使用其它系统的用户实现本系统的登陆的方式。如:在京东中使用微信登陆。

1.2 SSO系统

1.2.1 早期多系统登录解决方案

单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器与服务器之间维护会话状态。但cookie是有限制的,这个限制就是cookie的域(通常对应网站的域名),浏览器发送http请求时会自动携带与该域匹配的cookie,而不是所有cookie

既然这样,为什么不将web应用群中所有子系统的域名统一在一个顶级域名下,例如“*.baidu.com”,然后将它们的cookie域设置为“baidu.com”,这种做法理论上是可以的,甚至早期很多多系统登录就采用这种同域名共享cookie的方式。

共享cookie的方式存在众多局限。

应用群域名得统一

应用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间

cookie本身不安全。

1.2.2 基于CAS的SSO系统

CAS即Central Authentication Service模型(中央式认证服务),该协议是为应用提供可信身份认证的单点登录系统。CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。

场景说明

子系统A域名:http://www.a.com
子系统B域名:http://www.b.com
CAS系统域名:http://www.cas.com
登录操作是在 CAS Server(登录中心)实现的,客户端 Web 应用 A、B 都是通过 Ticket 进行登录状态验证,验证通过后各自设置 Session 完成各自系统的认证,从而实现单点登录。
https://apereo.github.io/cas/6.5.x/protocol/CAS-Protocol.html#web-flow-diagram

2 通过Keycloak实现SSO

2.1 Keycloak 简介

2.1.1 什么是Keycloak?

Keycloak是为现代应用系统和服务提供开源的认证和授权访问控制管理。Keycloak 实现了OpenID、OAuth2.0、SAML单点登录协议,同时提供 LDAP 和 Active Directory 以及 OpenID Connect、SAML2.0 IdPs、Github、Google 等第三方登录适配功能,能够做到非常简单的开箱即用。

2.1.2 Keycloak中的常用核心概念

在这里插入图片描述

Users: 用户,使用并需要登录系统的对象

Roles: 角色,用来对用户的权限进行管理

Clients: 客户端,需要接入Keycloak并被Keycloak保护的应用和服务

Realms: 领域,领域管理着一批用户、证书、角色、组等,一个用户只能属于并且能登陆到一个域,域之间是互相独立隔离的, 一个域只能管理它下面所属的用户

2.2 OpenID Connect

2.2.1 什么是OpenID Connect?

在这里插入图片描述

OpenID Connect简称为OIDC,已成为Internet上单点登录和身份管理的通用标准。 它在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准协议。
OAuth2.0 只是一个授权协议,它授权第三方应用获取访问某些资源的权限,但是并不会提供任何用户信息。它通常是返回的是调用某些web api所需的access token。
2.2.2 OAuth授权流程

在这里插入图片描述

四种授权许可

Authorization Code:授权码,最经典的模式,用code来换token,这个最安全。

Implicit:隐式许可;不用code,直接获取token,适用于没有后端服务器的应用。

Resource Owner Password Credentials:通过资源所有者密码凭据,获取token

Client Credentials :客户端凭据。

[认证 & 授权] 1. OAuth2授权 - blackheart - 博客园 (cnblogs.com)

2.2.3 OpenID Connect授权流程

OpenID Connect对OAuth2.0接口进行了扩展,通过在协议中扩展身份认证所需的ID Token字段,增加UserInfo Endpoint接口,向第三方应用提供身份认证服务。

  1. 用户执行OAuth2.0的授权流程后,第三方应用获得Access Token和附加的ID Token,ID Token包含基本的用户身份信息,可用于身份认证。

  2. 如果需要更详细用户信息,第三方应用通过Access Token,从认证服务UserInfo Endpoint接口获取用户信息。

  3. 第三方应用可以把ID Token和UserInfo信息作为认证用户的用户信息。
    在这里插入图片描述

2.3 Keycloak实现SSO

在这里插入图片描述

2.3.1 系统接入SSO

2.3.2 实现过程

  1. 安装启动Keycloak

docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:18.0.1 start-dev

  1. 配置Keycloak
    Keycloak Admin Console
    创建配置Realm和Client
    创建Role和User

  2. SpringBoot集成Keycloak

添加依赖

<dependency><groupId>org.keycloak</groupId><artifactId>keycloak-spring-boot-starter</artifactId><version>10.0.0</version>
</dependency>
  1. 配置文件
spring:application:name: keycloakDemo
server:port: 8600
keycloak:# 表示是一个public的clientpublic-client: true# keycloak的地址auth-server-url: http://localhost:8080/auth# keycloak中的realmrealm: myrealm# client IDresource: keycloakDemo# 安全约束securityConstraints:- authRoles:# 以下路径需要demoUser角色才能访问- demoUsersecurityCollections:# name可以随便写- name: common userpatterns:- /demo/getValue
  1. 代码测试
@RestController
@RequestMapping("/demo")
class DemoController {@GetMapping("login")public String login(HttpServletRequest request) {Principal userPrincipal = request.getUserPrincipal();String username="Hello, ";if (userPrincipal instanceof KeycloakPrincipal) {KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>) userPrincipal;AccessToken accessToken=kp.getKeycloakSecurityContext().getToken();username += accessToken.getPreferredUsername();}return username;}

2.2.3 功能案例

参考资料
OAuth 2.0 — OAuth
Getting Started Guide (keycloak.org)
doc/keycloak-learn/Keycloak搭建手把手操作指南.md · 大目/spring-cloud-yes - Gitee.com


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

相关文章

sso单点登陆实现

多系统实现单点登录方案&#xff1a;SSO 单点登录 一、什么是单点登录SSO&#xff08;Single Sign-On&#xff09; SSO是一种统一认证和授权机制&#xff0c;指访问同一服务器不同应用中的受保护资源的同一用户&#xff0c;只需要登录一次&#xff0c;即通过一个应用中的安全验…

单点登陆和无状态登陆

很多人都听说过单点登陆。今天我们来说说什么是单点登陆和无状态登陆。 传统的项目都是使用session来验证登陆&#xff0c;但是在分布式项目中使用session是不行的。因为每个服务都是一个独立的项目&#xff0c;那么我们将服务拆分&#xff0c;肯定会有一个登陆的模块。如果将用…

windows文件句柄修改

找到如下注册表分支&#xff1a; HKEY_LOCAL_MACHINE – SOFTWARE – – Microsoft – – – Windows NT – – – – CurrentVersion – – – – – Windows 在右侧窗格中可以看到名为“GDIProcessHandleQuota”与“USERProcessHandleQuota”的注册表项; GDIProcessHandleQuo…

Linux 查看文件句柄信息

查看系统的最大文件句柄数和文件句柄的使用者PID ulimit -n查看当前系统的最大句柄数显示如下 ulimit命令详解 ulimit -HSn x设置当前系统的文件句柄数为x 以上命令中&#xff0c;H指定了硬性大小&#xff0c;S指定了软性大小&#xff0c;n表示设定单个进程最大的打开文件句柄…

Windows查看文件句柄

2019独角兽企业重金招聘Python工程师标准>>> 图形界面方式 打开任务管理器 2. 性能tab,点击链接打开资源监视器; 3. 现在cpu tab,关联的句柄后面的输入框可以输入你要搜索的文件路径,可模糊匹配; 命令方式 Windows系统本身并不内置命令查看句…

linux文件句柄数

1、问题阐述&#xff1a; too many open files&#xff1a;顾名思义即打开过多文件数。 不过这里的files不单是文件的意思&#xff0c;也包括打开的通讯链接(比如socket)&#xff0c;正在监听的端口等等&#xff0c;所以有时候也可以叫做句柄(handle)&#xff0c;这个错误通常…

windows 查看打开的文件句柄

经常当我们删除文件时&#xff0c;有时会提示【操作无法完成&#xff0c;因为文件已在另一个程序中打开&#xff0c;请关闭该文件并重试】&#xff0c; 这个时候可以资源监控器进行查看运行的进程打开的句柄列表。 具体结果如下显示&#xff1a;

Linux下文件句柄

Too many open files 如果Java打开文件的时候&#xff0c;没有关闭IO流&#xff0c;那么打开到一定数量&#xff0c;在Linux下就会抛出Too many open files的异常。 public static class HoldIOTask implements Runnable {Overridepublic void run() {int count0;try {while(t…

【Linux】文件句柄说明

Linux 文件句柄说明 Linux中所有的事物或资源都是以文件的形式存在&#xff0c;比如消息、共享内存、连接等&#xff0c;句柄可以理解为指向这些文件的指针。 对于这些句柄&#xff0c;Linux是有数量限制的&#xff0c;单个进程默认可以打开的句柄数上限&#xff0c;可以用以…

windows 文件句柄查询

windows经常出现删除/剪切文件时提示文件被占用的问题 打开任务管理器&#xff0c; 选择“性能”选项卡 2. 打开资源管理器&#xff0c; 在关联句柄查询框中输入关键字&#xff0c;过滤查询&#xff0c;然后右键选中对应项&#xff0c;结束任务即可释放句柄

文件句柄

一、文件句柄是什么&#xff1f; 对象在内存中是经常来回移动的&#xff0c;如何快速定位找到这个对象呢&#xff1f; 句柄说&#xff1a; “我来帮你找” windows系统给出的方案 1.进程创建时&#xff0c;windows系统为进程构造了一个句柄表 2.当该进程希望获得一个内核对…

linux开关机命令

shutdown -h now/或者是具体的时间hh:mm&#xff1b; 关机; -h:关机。&#xff1b;-r&#xff1a; 重启 &#xff1b;-c&#xff1a; 取消前一个关机命令。一般就只用shutdown这个命令&#xff1b;halt&#xff0c;poweroff&#xff0c;init 0 关机&#xff1b;init 6&#xff…

Linux命令之关机命令

shutdown命令可以用来进行关闭系统&#xff0c;并且在关机以前传送讯息给所有使用者正在执行的程序&#xff0c;shutdown 也可以用来重开机使用者权限&#xff1a;管理员用户 语法如下&#xff1a; shutdown [-t seconds] [-rkhncfF] time [message] 参数说明&#xff1a; …

Linux 关机 命令

一、正确的关机方法 如果直接按下电源开关&#xff0c;数据有可能中断。若不正常关机&#xff0c;则有可能造成文件系统的损毁。因此&#xff0c;正常关机情况下&#xff0c;应注意以下&#xff1a; 1&#xff09;查看系统的使用状态 查看目前有谁在线&#xff0c;使用“who…

部署图详解

部署图 一、部署图概要 ​ 部署图用于静态建模&#xff0c;是表示运行时过程节点结构、构件实例及其对象结构的图。如果含有依赖关系的构件实例放置在不同节点上&#xff0c;部署视图可以展示出执行过程中的瓶颈。部署图的两种表现形式&#xff1a;实例层部署图和描述层部署图…

EA_画部署图

EA_画部署图 新建部署图增加个性化图标画一个范围Boundary 新建部署图 右键–>添加图 增加个性化图标 右键图标–>外观–>选择可替代图像 选择自定义的图标 画一个范围Boundary

UML-----构件图与部署图

构件图和部署图这两个图都属于实现图。它是用来描述实现方面的信息。构件图用来显示一组构件之间的组织及依赖关系&#xff1b;而部署图则用来描述系统硬件的物理拓扑结构以及在此结构神执行的软件。 构件图 构件图是从软件结构的角度来描述一个系统的主要功能&#xff0c;如子…

移动端UML图应用之UML结构图——包图、部署图和组件图

系列文章目录 移动端UML图应用之UML图简述 移动端UML图应用之UML行为图——用例图、活动图和状态机图 移动端UML图应用之UML交互图——顺序图和通信图 移动端UML图应用之UML结构图——包图、部署图和组件图 移动端UML图应用之UML结构图——类图 文章目录 系列文章目录一、包图…

【UML建模】(7) UML建模之部署图

您好&#xff0c;我是码农飞哥&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 ❤️ 2. Python爬虫专栏&#xf…

UML—部署图

一、简介&#xff1a; 部署图&#xff08;Deployment Diagram&#xff09;又名实施图。用来描述系统硬件的物理拓扑结构以及在此结构上执行的软件。显示了系统的硬件、安装在硬件上的软件、以及用于连接异构机器之间的中间件。系统所有的实施图一起表示系统的完整结构。具有以下…