【实践篇】基于CAS的单点登录实践之路
作者:京东物流 赵勇萍
前言
上个月我负责的系统SSO升级,对接京东ERP系统,这也让我想起了之前我做过一个单点登录的项目。想来单点登录有很多实现方案,不过最主流的还是基于CAS的方案,所以我也就分享一下我的CAS实践之路。
什么是单点登录
单点登录的英文名叫做:Single Sign On(简称SSO)。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。之前我做的系统,需要需要设计一套支持单点登录的鉴权认证系统,所有系统都基于一套鉴权系统进行登录,并且可以实现各个系统之间的互信和跳转。所以就采用了CAS架构。
什么是CAS
CAS架构的核心是需要搭建一个CAS Server,该服务独立部署,拥有独立三级域名,主要负责对用户的认证工作。他主要组成包括WEB前端提供登录页面,票据模块,认证模块。
核心票据:
a. TGT(Ticket Grangting Ticket):TGT是CAS为用户签发的登录票据,有TGT就表明用户在CAS上成功登录过。用户在CAS认证成功后,会生成一个TGT对象,放入自己的缓存中(Session),同时生成TGC以cookie的形式写入浏览器。当再次访问CAS时,会先看cookie中是否存在TGC,如果存在则通过TGC获取TGT,如果获取到了TGT则代表用户之前登录过,通过TGT及访问来源生成针对来源的ST,用户就不用再次登录,以此来实现单点登录。
b. TGC(Ticket-granting cookie):TGC就是TGT的唯一标识,以cookie的形式存在在CAS Server三级域名下,是CAS Server 用来明确用户身份的凭证。
c. ST(Service Ticket):ST是CAS为用户签发的访问某一客户端的服务票据。用户访问service时,service发现用户没有ST,就会重定向到 CAS Server 去获取ST。CAS Server 接收到请求后,会先看cookie中是否存在TGC,如果存在则通过TGC获取TGT,如果获取到了TGT则代表用户之前登录过,通过TGT及访问来源生成针对来源的ST。用户凭借ST去访问service,service拿ST 去CAS Server 上进行验证,验证通过service生成用户session,并返回资源。
基于CAS的系统实践方案
1. 业务背景
在我负责的项目系统中,后台业务采用的是微服务架构,有统一的业务网关,所以基于统一的业务网关,整合客户其他系统登录鉴权流程。具体业务架构图如下:

在此说明一下,因为登录系统的用户体系在不同的系统中,所以我在设计SSO统一登录认证的时候,把SSO系统与业务系统结构出来。而用户体系有两套,一套叫做采方用户体系,一套叫做供方用户体系。所以才会有如图所示的SSO Server服务,他本身不负责用户管理,但会通过统一标准接口的方式实现控制反转,实现对用户服务的调用。
2. 单点登录时序图
时序图如下:

如图所示,时序图标识的是两个系统通过SSO服务,实现了单点登录。
3. 单点登录核心接口说明
3.1 sso认证跳转接口
调用说明:
由应用侧发起调用认证中心的接口。
URL地址:
https:// sso.com?appId=***&tenantType=1&redirectUri=***
请求方式:302重定向
参数说明:
appId: 对接SSO认证中心的应用唯一标识,由SSO认证中心通过线下的方式颁发给各个应用系统。
tenantType: 标记是供方登录还是采方登录。采方为1,供方为2.
RedirectUri: 应用回调地址。
3.2 重定向获取临时令牌code接口
调用说明:
有认证中心发起,应用侧需实现的接口。认证中心通过302重定向,将code传给应用侧,应用侧自行发起通过临时令牌code换取accessTokenInfo。
URL地址:
https://应用域名?code=***
请求方式:GET
参数说明:
Code: 临时令牌,有效时间5min
3.3 获取accessTokenInfo接口
调用说明
由应用侧发起调用认证中心的接口。通过该接口可以获取accessTokenInfo信息,然后系统自行生成本系统session信息。
URL地址:
https://sso.com/api/token/create?grantType=authorization_code&appId=yuncai&code=***
请求方式:GET
参数说明:
appId: 对接SSO认证中心的应用唯一标识,由SSO认证中心通过线下的方式颁发给各个应用系统。
code: 临时令牌,需加密
加密规则如下:
Code先进行base64加密
用认证中心给的privateKey进行加密(RSA加密)。
加密后进行URLCode转码。
返回参数:
{
“accessToken”: “****”, //token令牌
“expiresIn”: 7200, //过期时间
“user”: {
“username”: “zhangsan”,
“fullName”: “张三”,
“userId”: “1212”,
“phone”: “13100000000”,
“email”: zhangsan@test.com,
“tenantId”: “S2131123”,
“tenantType”: 1
}
}
3.4 刷新Token接口
调用说明:
由应用侧发起调用认证中心的接口。当token快到失效期时,通过该接口可以刷新accessTokenInfo信息,然后系统自行生成本系统session信息。
URL地址:
https://sso.com/api/token/refresh?appId=yuncai&accessToken=***
请求方式:GET
参数说明:
appId: 对接SSO认证中心的应用唯一标识,由SSO认证中心通过线下的方式颁发给各个应用系统。
accessToken: 需要刷新的token值。
4. 单点登出逻辑
有单点登录,也会有单点登出,这样才会形成业务闭环,对于单点登出逻辑,基本类似登录的逆操作,时序图如下:

5. 单点登出核心接口说明
5.1 登出sso认证中心跳转接口
调用说明:
由应用侧发起调用认证中心的接口。
URL地址:
https://sso.com/logout?redirectUri=***
请求方式:GET
参数说明
RedirectUri: 应用回调地址。
5.2 应用系统退出接口
调用说明
有认证中心发起,应用侧需实现的接口。通过该接口触发个应用系统清除缓存和session相关信息,实现系统登出。
URL地址:
https://应用系统域名/ssoLogout
请求方式:GET
header: logoutRequest:=accessToken
总结
对于CAS这种单点登录的架构,他是非常依赖于cookie的安全性的。所以CAS的安全性也在一定程度上取决于cookie的安全性,所有增强cookie安全性的措施,对于增强CAS都是有效的。
最后提一句,一定要使用HTTPS协议哦。
【实践篇】基于CAS的单点登录实践之路的更多相关文章
- 基于CAS的单点登录实战(2)-- 搭建cas的php客户端
在这之前已经搭好了CAS服务端 基于CAS的单点登录实战(1)-- 搭建cas服务器 PHP-Client php-Client是官方支持的,去官网下个最新版就好了.phpCAS 接入很简单,解压放到 ...
- SSO 基于CAS实现单点登录 实例解析(二)
本文目录: 概述 演示环境 部署CAS-Server相关的Tomcat 部署CAS-Client相关的Tomcat 测试验证SSO 第一: 本demo在一个机器上实现(三个虚拟主机),来看SSO单点登 ...
- 基于CAS实现单点登录(SSO):工作原理
工作中使用到了SSO,网上看到了这个博客的一系列文章感觉不错,转载收藏 源地址http://blog.csdn.net/tch918/article/details/19930037 系列文章的第一篇 ...
- SSO单点登录学习总结(3)—— 基于CAS实现单点登录实例
第一: 本demo在一个机器上实现(三个虚拟主机),来看SSO单点登录实例(我们可以布到多个机器上使用都是同一个道理的),一个服务器主机,和两个客户端虚拟主机 [html] view plaincop ...
- (转)基于CAS实现单点登录(SSO):cas client端的退出问题
出处:http://blog.csdn.net/tch918/article/details/22276627 自从CAS 3.4就很好的支持了单点注销功能,配置也很简单. 之前版本因为在CAS服务器 ...
- [原]基于CAS实现单点登录(SSO):cas client端的退出问题
自从CAS 3.4就很好的支持了单点注销功能,配置也很简单. 之前版本因为在CAS服务器通过HttpClient发送消息时并未指定为POST方式,所以在CAS客户端的注销Filter中没有收到POST ...
- [原]基于CAS实现单点登录(SSO):登录成功后,cas client如何返回更多用户信息
从cas server登录成功后,默认只能从casclient得到用户名.但程序中也可能遇到需要得到更多如姓名,手机号,email等更多用户信息的情况. cas client拿到用户名后再到数据库中查 ...
- 基于CAS的单点登录实战(1)-- 搭建cas服务器
公司有几个系统想做SSO,然后开始研究cas.系统是Centos7 搭建CAS服务器 cas的版本比较多,先在网上搜了一下各种教程配置经验.本来想搭建最新的CAS版本,然而为了快速部署,选择了网上教程 ...
- CAS实现单点登录SSO执行原理及部署
一.不落俗套的开始 1.背景介绍 单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS框架:CAS(Centra ...
- 基于SAML的单点登录介绍
http://blog.csdn.net/csethcrm/article/details/20694993 一.背景知识: SAML即安全断言标记语言,英文全称是Security Assertion ...
随机推荐
- flink常用命令
1.查看flink任务 /var/lib/hadoop-hdfs/flink/bin/flink list 2.停止flink任务 /var/lib/hadoop-hdfs/flink/bin/fl ...
- Windows 解决teamview远程必须mstsc连接
真实原因是你的TeamViewer一直在用远程桌面的ID进行登录,所以一旦远程桌面断开,TeamViewer就无法连接了.因此我们只需要切换为服务器的TeamViewer ID即可,服务器的TeamV ...
- Sentinel介绍与使用
https://blog.csdn.net/noaman_wgs/article/details/103328793
- 循环文件夹汇总所有发票开具Excel文件数据
'xlsx cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 8.0;hdr=no;imex= ...
- 如何让charles无论怎么请求都返回一个结果
1. map Local 将匹配的url映射到本地文件.这个需要首先将url右键,save Response,将原有报文保存到本地,然后映射到该文件,修改该文件即可,直接自己写费事2. ...
- 一道网红题:Java值传递,答案开始看了不太懂,是不是涉及到了匿名类的实例化?
题目如下:看起来是值传递的考察... public class Test{ public static void main(String[] args){ int a = 10; int b = 10 ...
- CH573 CH582 CH579蓝牙主机(Central)例程讲解一(主机工作流程)
蓝牙主机,顾名思义,就是一个蓝牙主设备,与从机建立连接进行通信,可以接收从机通知,也可以给从机发送信息,可将Central例程和Peripheral例程结合使用. 蓝牙主机例程的工作流程大致如下: 一 ...
- Asp.Net Core 网站使用TinyMCE实现上传图片
1.下载TinyMCE https://www.tiny.cloud/get-tiny/self-hosted/ 解压缩后放在网站wwwroot目录 2.下载中文语言包 https://www.tin ...
- npm & cnpm 淘宝源
前提:如果确实需要多版本的情况可以使用nvm 可以方便的安装和切换多版本! --nvm ls --nvm use 12.4.0 永久npm 设置淘宝源npm config set registry h ...
- 韦东山005_ARM裸机1期加强版
005_ARM裸机1期加强版(又叫新1期,151节,23节免费,已完结)\新1期视频(151节,23节免费) 第006课开发板熟悉与体验(6节,免费) 第001节_开发板部件介绍与串口连接(免费) 如 ...