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

news2024/12/22 14:41:10

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

前沿

单点登录(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.coloradmin.cn/o/1409197.html

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

相关文章

❤css实用

❤ css实用 渐变色边框(Gradient borders方法的汇总 5种-代码可直接下载) 资源链接 https://download.csdn.net/download/weixin_43615570/88779950?spm1001.2014.3001.5503 给 border 设置渐变色是很常见的效果,实现这个效果有很多思路 1…

SAP EXCEL上传如何实现指定读取某一个sheet页(ALSM_EXCEL_TO_INTERNAL_TABLE)

如何读取指定的EXCEL sheet 页签,比如要读取下图中第二个输出sheet页签 具体实现方法如下: 拷贝标准的函数ALSM_EXCEL_TO_INTERNAL_TABLE封装成一个自定义函数ZCALSM_EXCEL_TO_INTERNAL_TABLE 在自定义函数导入参数页签新增一个参数SHEET_NAME 在源代码…

MacOS 无法ping 通 github.com 解决方案

ping github.com 会显示请求超时: PING github.com (192.30.253.112): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 Request timeout for icmp_seq 2 Request timeout for icmp_seq 3 Request timeout for icmp_seq 4 Request …

硬件-11-服务器的基础知识

参考服务器基础知识大科普 1 电视剧背景 服务器被誉为互联网之魂。 电视剧《创业年代》是一部有冯绍峰和袁姗姗等人联手主演的一部讲述我国第一批科技创业者创业故事的电视剧,可以说是他们铲下了建设中关村的第一捧土。 电视剧《创业年代》中的潮信公司并没有…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-Tag标签管理实现

锋哥原创的SpringbootLayui python222网站实战: python222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火…

特征抽取-----机器学习pycharm软件

导入包 from sklearn.datasets import load_iris # 方法datasets_demo()数据集使用 from sklearn.feature_extraction import DictVectorizer # 方法dict_demo()字典特征抽取用 from sklearn.feature_extraction.text import CountVectorizer # 方法count_demo()文本特征抽…

【Web前端实操11】定位实操_照片墙(无序摆放)

设置一个板块&#xff0c;将照片随意无序摆放在墙上&#xff0c;从而形成照片墙。本来效果应该是很唯美好看的&#xff0c;就像这种&#xff0c;但是奈何本人手太笨&#xff0c;只好设置能达到照片墙的效果就可。 代码如下&#xff1a; <!DOCTYPE html> <html lang&…

企业为何对数据可视化越发看重?

数据可视化&#xff0c;作为信息时代的一项重要技术&#xff0c;正在企业中崭露头角&#xff0c;逐渐成为业务决策和运营管理的得力助手。企业之所以对数据可视化如此重视&#xff0c;是因为它为企业带来了诸多实际利益和战略优势。 首先&#xff0c;数据可视化为企业提供了更…

人工蜂群算法解决Rastrigin函数全局最小值问题的python示例实现

人工蜂群优化算法&#xff08;Artificial Bee Colony Optimization&#xff0c;简称ABC算法&#xff09;是一种基于蜜蜂觅食行为的优化算法&#xff0c;由Karaboga于2005年提出。该算法模拟了蜜蜂群体在寻找食物过程中的行为&#xff0c;通过不断地搜索和信息交流来寻找最优解。…

mapstruct中在怎样将String转化为List

最近在公司遇到了这样一个为题&#xff0c;前端传过来的是一个List<Manager>,往数据库中保存到时候是String&#xff0c;这个String使用谷歌的json转化器。 当查询的时候在将这个数据库中String的数据以List<Manager>的形式返回给前端。 使用mapstruct中在怎样将St…

应对算力资源紧缺需求,猿界算力推出A100高性能算力GPU服务器租赁整体解决方案

在当今科技快速发展的浪潮下&#xff0c;人工智能、大数据分析和科学研究等领域对高性能计算资源的需求越来越大。然而&#xff0c;当前的算力市场却面临着资源紧缺的挑战&#xff0c;给科研机构、企业和个人用户的计算密集型任务带来了很大的困扰。为了解决这一问题&#xff0…

蓝桥杯官网填空题(01串的熵)

问题描述 答案提交 这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。 import java.util.*;public class Main {public static void main(String[] args) {for(double zero1;zero<2333…

【CodeTop】TOP 100 刷题 51-60

文章目录 51. 缺失的第一个正数题目描述代码与解题思路 52. 训练计划 II题目描述代码与解题思路 53. 子集题目描述代码与解题思路 54. 最小覆盖子串题目描述代码与解题思路 55. 从前序与中序遍历序列构造二叉树题目描述代码与解题思路 56. 零钱兑换题目描述代码与解题思路 57. …

如何生成漂亮的静态文档说明页

分享&#xff1a;如何生成漂亮的静态文档说明页 最近经常被问 https://t.itmuch.com/doc.html 文档页是怎么制作的&#xff0c;考虑到步骤略复杂&#xff0c;写篇手记总结下吧。 TIPS https://t.itmuch.com/doc.html 是个人在慕课网视频《 面向未来微服务:Spring Cloud Alibab…

3.7V升5V 12V 24V 30V 24V/5A升压恒压芯片-H6922

升压恒压芯片是一种电源管理集成电路&#xff0c;其主要功能是将输入电压提升到稳定的输出电压。以下是升压恒压芯片的一些优点&#xff1a; 稳定输出电压&#xff1a;升压恒压芯片能够确保输出电压维持在一个恒定的水平&#xff0c;不受输入电压波动的影响。这有助于提供稳定的…

数字图像处理(实践篇)二十九 OpenCV-Python在图像中检测矩形、正方形和三角形的实践

目录 1 方案 2 实践 1 方案 ①检测矩形和正方形 ⒈检测图像中的所有轮廓。 ⒉循环检查所有检测到的轮廓。 ⒊为每个轮廓找到近似的轮廓。如果近似轮廓中的顶点数为4,则计算宽高比用来区分矩形和正方形。如果宽高比在0.9到1.1之间,则认为为正方形,否则的话,则为矩形。…

Pyecharts绘图

文章目录 柱状图折线图饼图组合图 柱状图 #柱状图 from pyecharts.charts import Bar from pyecharts import options as opts #去掉警告信息 import pyecharts pyecharts.globals._WarningControl.ShowWarning False # 数据 cate t1[行政区].tolist() data1 t1[单价].tolist…

引领AI变革:边缘计算与自然语言处理结合的无尽可能

引言 讲到Ai&#xff0c;你第一时间会想到什么&#xff1f;是Chagpt和文心一言这样与人类交流自然的Ai生成式对话服务&#xff1f;还是根据关键字快速制图的Ai绘图&#xff1f;这些都是近年来人们所常知的Ai用途&#xff0c;我们今天来讲讲以自然语言处理为辅&#xff0c;在Ai赋…

java web 校园健康管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web校园健康管理系统是一套完善的java web信息管理系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

Linux命令-systemctl

一、systemctl命令简介 CentOS 5使用SysV init&#xff1b;CentOS 6使用Upstart&#xff0c;CentOS 7使用Systemd管理守护进程。centos7采用 systemd管理&#xff0c;服务独立的运行在内存中&#xff0c;服务响应速度快&#xff0c;但占用更多内存。独立服务的服务启动脚本都在…