单点登陆(SSO)基于CAS实现前后端分离的SSO系统开发「IDP发起」

关于其他前端常见登录实现+单点登录方案,请见「前端常见登录实现方案 + 单点登录方案

前沿

单点登录(SSO),英文全称为 Single Sign On。 SSO 是指在多个应用系统中,用户只需要登录一次,就可以访问所有相互信任的应用系统。

一般同域的SSO,用共享session就可以实现了,常见于各微服务都是自己开发的情况。更普遍的场景是跨域集成的SSO,这时候一般采用标准的CAS方案。

IDP SSO 服务用于解决同一公司不同业务应用之间的身份认证问题,只需要登录一次,即可访问所有添加的应用。此服务可以涵盖用户在公有云和私有云中的双重需求。

几个名词

  • TGT: (Ticket Granting Ticket)这是CAS Server里保存的,用于认证用户已经在CAS登录过

  • TGC: (Ticket Granting Cookie)跟上面的TGT对应,是已经认证过的用户在浏览器里保存的cookie

  • ST: (Service Ticket)这是CAS Server发给应用服务器的凭证,应用服务器再用ST到CAS Server认证

  • Authentication: 【认证】即确认该用户的身份是他所声明的那个人

  • Authorization:【授权】即根据用户身份授予他访问特定资源的权限


CAS认证

Central Authentication Service简称CAS,是一种常见的B/S架构的SSO协议。和其他任何SSO协议一样,用户仅需登陆一次,访问其他应用则无需再次登陆。
CAS是一种仅用于Authentication【认证】的服务,它和OAuth/OIDC协议不一样,并不能作为一种Authorization【授权】的协议。
当前CAS协议包括CAS 1.0、CAS2.0、CAS3.0版本,这三个版本的认证流程基本类似。

👇 下面一个标准的CAS认证流程图:

在这里插入图片描述

大致流程:
当用户请求应用服务器提供的某个服务abc,如果没有登录过,那么会返回一个302,跳转到 cas/login?service=abc,在CAS登录后,又会302到abc?ticket=STxxxxx(这里abc就是前面service填的地址),应用服务器用这个ticket到CAS Server认证,如果OK的话,再一次302到abc,完成整个认证过程


IDP 全流程(前后端分离的场景)

现在web应用一般采用前后端分离的架构,通过ajax请求后端服务,这样会无法跳转回原来的静态页面,需要对原有的CAS流程的稍加改造,下面是一个基于CAS实现的IDP系统的完整流程。

👇 应用A 通过 IDP登录

在这里插入图片描述

👆 阐述 IDP 发起的单点登录流程:

  1. 用户访问应用A页面,如:http://a.com/item
  2. 应用A向A后端请求接口,如:http://a.com/api/item
  3. A后端检测登录状态,若该用户已登录直接跳至步骤(15. 正常访问),未登录则返回状态码403&跳转链接,如:http://idp.com
  4. 应用A携带 target_url 重定向到 IDP 登录页面,如:http://idp.com?callback=a.com/item
  5. 用户在IDP中输入 IDP 的登录手机号并请求验证码
  6. IDP前端向IDP后端服务请求验证码接口,如:http://idp.com/api/code
  7. IDP后端别用户手机发送验证码
  8. 用户填写验证码,并登录
  9. IDP前端向IDP后端服务请求登录接口,如:http://idp.com/api/session
  10. IDP后端认证通过后,会生成 TGC&ST,返回给IDP前端
  11. IDP前端 302 跳转到应用A页面到 SSO URL 地址 redirect_uri并携带ST,如:http://a.com/item?st=xxx
  12. 应用A页面通过url中的st向应用A后端去认证登录
  13. 应用A后端再去IDP后端认证登录状态,如:http://idp.com/profile?st
  14. IDP后端认证通过后,向应用A后端返回用户的信息
  15. 应用A后端拿到用户信息生成 Token并返回给应用A前端保存
  16. 最终,用户查看到之前访问的应用A前端,如:http://a.com/item

👇 IDP登录成功,应用B 通过 IDP直接登录

在这里插入图片描述

👆 阐述IDP登录成功,应用B 通过 IDP直接单点登录流程:
【大致步骤同应用A 通过 IDP登录,只是少了IDP登录认证的几步】

  1. 用户访问应用B页面,如:http://b.com/item
  2. 应用B向B后端请求接口,如:http://b.com/api/item
  3. B后端检测登录状态,若该用户已登录直接正常访问,未登录则返回状态码403&跳转链接,如:http://idp.com
  4. 应用B携带 target_url 重定向到 IDP 登录页面,如:http://idp.com?callback=b.com/item
  5. IDP前端通过session获取TGC向IDP后端服务换取ST,IDP后端认证通过后向IDP前端返回ST
  6. IDP前端 302 跳转到应用B页面到 SSO URL 地址 redirect_uri并携带ST,如:http://b.com/item?st=xxx
  7. 应用B页面通过url中的st向应用B后端去认证登录
  8. 应用B后端再去IDP后端认证登录状态,如:http://idp.com/profile?st
  9. IDP后端认证通过后,向应用B后端返回用户的信息
  10. 应用B后端拿到用户信息生成 Token并返回给应用B前端保存
  11. 最终,用户查看到之前访问的应用B前端,如:http://b.com/item

👇 应用退出登录,IDP退出,所有平台都退出登录

在这里插入图片描述

👆 阐述应用退出登录,IDP单点退出登录流程:

  1. 用户访问应用A页面,点击退出登录,如:http://a.com/logout
  2. 应用A向A后端请求退出登录接口,如:http://a.com/api/logout
  3. A后端向IDP后端发送退出登录请求,注销全部TGC&ST
  4. IDP后端向所有应用后端告知退出事件,如:http://a.com/callback、http://b.com/callback

小结

注意:我们需要对redirect_uri做部分定制并encoding

至此,基于CAS实现的前后端分离的SSO系统开发完毕。如果对流程有问题,欢迎大家讨论

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

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

相关文章

redis-持久化-1

Redis 提供了2个不同形式的持久化方式。 RDB(Redis DataBase) AOF(Append Of File) 一、Redis持久化之RDB 1.什么是RDB 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照&#xff0c…

puppeteer实现截图

Window服务器说明 1.在本地安装 puppeteer 先创建一个本地文件夹puppeteer,我的地址D:\common_workspace\puppeteer 然后使用cmd打开这个文件夹所在位置,再执行如下两条命令即可。 npm install -g cnpm --registryhttps://registry.npm.taobao.orgcnpm …

剖析EasyExcel导入出现 The index of ‘xx‘ and ‘xx‘ must be inconsistent 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 在导出Excel的时候,出现如下问题: com.alibaba.excel.exception.ExcelCommonException: The index of tyreNumber and remark must be inconsistentat com.alibaba.exce

为什么需要数据仓库

为什么不在OLTP环境下分析? OLTP环境也会存储历史数据,但这些历史数据并不是业务运行所需的,这些历史数据需要经常归档到数据仓库,并且在OLTP数据库中删除。 相比之下,事务环境适用于连续处理事务,通常应…

搭建通讯猫类似的TCP服务端

最近需要一个公网的TCP服务端平台来做4G模组的发包测验,通讯猫(http://www.tongxinmao.com/App/Detail/id/1)貌似使用不了,就干脆在自己的腾讯云上搭建了简单的TCP服务端。 我们搭建可以在服务器上使用Python、Java、C#等语言自行编写服务器程序。 目前是…

KADB使用PXF连接KES验证

验证环境 KADB版本:Greenplum Database 6.0.0 build dev.V003R002C001B0181.d354cc9215 KES版本:KingbaseES V008R006C007B0012 Java版本:openjdk version "1.8.0_262" PXF部署 以下操作假设KADB和KES已经部署完成并且启动正常…

nomachine下载安装使用教程(远程桌面)

文章目录 参考链接 nomachine 参考链接 [1]【远程桌面】nomachine下载安装使用教程、zerotier下载安装使用教程超详细:https://blog.csdn.net/weixin_44029896/article/details/128555481 [2] 树莓派开发之旅(一)——使用Nomachine进行远…

java动态导入excel按照表头生成数据库表

1、创建接口接收文件 //controller层 PostMapping("/importExcel1")public void importExcel1(HttpServletRequest request, MultipartFile file) {try {waterMeterService.importExcel1(request,file);} catch (Exception e) {throw new RuntimeException(e);}}//se…

selenium执行出现异常,SessionNotCreatedException ChromeDriver only supports

问题现状: 运行程序报错: selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114 Current browser version is 121.0.6167.85 with binary path /App…

重构改善既有代码的设计-学习(四):简化条件逻辑

1、分解条件表达式(Decompose Conditional) 可以将大块代码分解为多个独立的函数,根据每个小块代码的用途,为分解而得的新函数命名。对于条件逻辑,将每个分支条件分解成新函数还可以带来更多好处:可以突出条…

cartopy绘图特征

文章目录 添加特征add_feature区域截取 添加特征 cartopy中最基础的地图绘制函数是coastlines,即海岸线线条图,这很复合我们的绘图直觉,毕竟陆地和海洋的边缘,是最清晰的地理特征。而在此之上,还可以通过add_feature函…

Java 面试题库

基础篇 面向对象的特征 封装(Encapsulation): 封装是指将对象的数据(属性)和行为(方法)结合在一起,形成一个独立的实体。对象的数据被隐藏在内部,只能通过定义好的接口&…

【嵌入式学习】网络通信基础-项目篇:简单UDP聊天室

源码已在GitHub开源:0clock/LearnEmbed-projects/chat 实现的功能 客户端功能: 上线发送登录的用户名[yes] 发送消息和接收消息[yes] quit退出 服务器端功能: 统计用户上线信息,放入链表中[yes] 接收用户信息并给其他用户发送消…

Windows11 鼠标拖动文件到CMD控制终端窗口无效,无法显示具体文件路径

对于某些用户来说,他们可能会在Windows 11上遇到鼠标拖动文件到CMD控制终端时,无法显示具体文件路径的情况。 系统更新,习惯基础操作无效了,真的有点烦,不会提问就无计可施。 果然善于提问,才有果子吃 问…

架构师之路(十五)计算机网络(网络层协议)

前置知识(了解):计算机基础。 作为架构师,我们所设计的系统很少为单机系统,因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 ARP协议 地址解…

分类预测 | Matlab实现GRU-Attention-Adaboost基于门控循环单元融合注意力机制的Adaboost数据分类预测/故障识别

分类预测 | Matlab实现GRU-Attention-Adaboost基于门控循环单元融合注意力机制的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现GRU-Attention-Adaboost基于门控循环单元融合注意力机制的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 …

SpringBoot项目多数据源配置与MyBatis拦截器生效问题解析

在日常项目开发中,由于某些原因,一个服务的数据源可能来自不同的库,比如: 对接提供的中间库,需要查询需要的数据同步数据,需要将一个库的数据同步到另一个库,做为同步工具的服务对接第三方系统…

服务器渲染+自定义模块+mysql操作

1.服务器渲染 A.第一步&#xff0c;导入模块库和第三方库 npm init npm --registry https://registry.npmmirror.com install art-template moment B.第二步&#xff0c;调整html文件 <!DOCTYPE html> <html lang"en"><head><meta charset…

K8s-应用管理(环境变量,Job)

容器传参 构建一个测试镜像 FROM ubuntu CMD ["sleep"&#xff0c;"5"]运行这个容器发现睡眠了5秒以后退出&#xff0c;如果我们希望自己指定可以直接在docker后面加命令覆盖&#xff0c;写法如下 docker run sleeper sleep 10上面的过程显得有些不合理…

Redis面试

1.说说什么事redis Redis是一种基于键值对的NoSql数据库。 Redis中的value支持string&#xff08;字符串&#xff09;、hahs&#xff08;哈希&#xff09;、list、set、zset&#xff08;有序集合&#xff09;、bitmaps&#xff08;位图&#xff09;&#xff0c;HyperLoglog等数…