Cas 4.2.7 OAuth+Rest 实现SSO
- 部分系统使用授权免登的方式进入到CAS单点登录系统,同时又希望能使用SSO切换到其他系统。
- 部分业务系统有自己的登陆页面,在自己的登陆逻辑中调用Cas的Rest接口实现登陆,同时希望能使用SSO切换到其他系统
- 分析Rest接口发现,调用 cas/v1/tickets/ 接口登陆成功后cas返回了用户的身份信息TGT,那么TGT和TGC有什么关联呢?aaarticlea/png;base64,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AZaw2hVkCbFnzpxZa5DtCqj1X9asOshC/F/YTKtMRERERERkF9nLJ7LYFWSvu+66edjl67qCLIGx6/+r1v/zyjpt4ykq/9omyqMsjD6p+7k3X39cluugK7TGv82hXkREREREZFc5qCBLGU9iWV5HkI0AGWG0QjkBNEMojXDLE9hYhq4nshFc6Yt6+s3t+p6+0id1XU+BRUREREREps5BBVnWY7+rDrJDAiIhtT4NpSy2oW5okKUtQZYQu0yQhajvCtwiIiIiIiJT5mCCLOv8bmy19fHjIbboC4hdoXTTQZY+qYt9ioiIiIiI7BoH9UQ2u+nfkSVotsLjoiDbCqRjgyztYlsREREREZFdZe+CbOvJK6G1tltnkIW+gJpZ1I6ASvjECMd9QTbahlHeFW5FRERERER2jb19Irtul4EwSdgUERERERGR02OQHamIiIiIiIhsB4PsSEVERERERGQ7GGRHKiIiIiIiItvBIDtSERERERER2Q4G2ZGKiIiIiIjIdjDIjlRERERERES2g0F2pCIiIiIiIrIdDLIjFRERERERke1gkB2piIiIiIiIbAeD7EhFRERERERkOxhkRyoiIiIiIiLbwSA7UhEREREREdkOBtmRioiIiIiIyHYwyI5UREREREREtoNBdqQiIiIiIiKyHQyyIxUREREREZHtYJAdqYiIiIiIiGwHg+xIRUREREREZDsYZEcqIiIiIiIi28EgO1IRERERERHZDgbZkYqIiIiIiMh2MMiOVERERERERLaDQXakIiIiIiIish0MsiMVERERERGR7WCQHamIiIiIiIhsB4PsSEVERERERGQ7GGRHKiIiIiIiItvBIDtSERERERER2Q4G2ZGKiIiIiIjIdjDIjlRERERERES2g0F2pCIiIiIiIrIdDLIjFRERERERke1gkB2piIiIiIiIbAeD7EhFRERERERkOxhkRyoiIiIiIiLbwSA7UhEREREREdkOBtmRioiIiIiIyHYwyI5UREREREREtoNBdqQiIiIiIiKyHQyyIxUREREREZHtYJAdqYiIiIiIiGwHg+xIRUREREREZDsYZEcqIiIiIiIi28EgO1IRERERERHZDgbZkYqIiIiIiMh2MMiOVERERERERLbD6oPsbPb/B6PKVuYLHUXTAAAAAElFTkSuQmCC" alt="" name="en-media:image/png:b9df742c6de93ad36959bf0704fc082d:none:none" />
- 继续分析cas登陆流程,Cas使用spring-webflow控制登陆流程,找到WEB-INF/webflow/login/login-webflow.xml。在flow执行之前Cas先做了些处理,如下配置
<on-start>
<evaluate expression="initialFlowSetupAction"/>
</on-start>追踪到InitialFlowSetupAction类的doExecute方法发现核心代码:
WebUtils.putTicketGrantingTicketInScopes(context,this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request));
代码说明:当用户访问Cas登陆页时,程序调用this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request)方法获取TGT并存放入当前作用域中。
try {
final Cookie cookie = org.springframework.web.util.WebUtils.getCookie(
request, getCookieName());
return cookie == null ? null : this.casCookieValueManager.obtainCookieValue(cookie, request);
} catch (final Exception e) {
logger.debug(e.getMessage(), e);
}
return null;
代码说明:逻辑比较简单,直接从cookie中获取TGC(getCookieName()方法有兴趣可以追踪下看看),如果TGC不为空,调用this.casCookieValueManager.obtainCookieValue(cookie, request)方法解析TGC得到TGT,问题逐渐明朗了,TGT是根据TGC获取到的。
final String cookieValue = this.cipherExecutor.decode(cookie.getValue());
LOGGER.debug("Decoded cookie value is [{}]", cookieValue);
if (StringUtils.isBlank(cookieValue)) {
LOGGER.debug("Retrieved decoded cookie value is blank. Failed to decode cookie [{}]", cookie.getName());
return null;
} final String[] cookieParts = cookieValue.split(String.valueOf(COOKIE_FIELD_SEPARATOR));
if (cookieParts.length != COOKIE_FIELDS_LENGTH) {
throw new IllegalStateException("Invalid cookie. Required fields are missing");
}
final String value = cookieParts[0];
final String remoteAddr = cookieParts[1];
final String userAgent = cookieParts[2]; if (StringUtils.isBlank(value) || StringUtils.isBlank(remoteAddr)
|| StringUtils.isBlank(userAgent)) {
throw new IllegalStateException("Invalid cookie. Required fields are empty");
} if (!remoteAddr.equals(request.getRemoteAddr())) {
throw new IllegalStateException("Invalid cookie. Required remote address does not match "
+ request.getRemoteAddr());
} if (!userAgent.equals(request.getHeader("user-agent"))) {
throw new IllegalStateException("Invalid cookie. Required user-agent does not match "
+ request.getHeader("user-agent"));
}
return value;
代码说明:首先解密TGC后得到一个由@符号分隔的字符串,分隔后获取到TGT、客户端IP、客户端代理信息。并将从TGC中解密的客户端IP信息和客户端代理信息与当前请求的客户端IP信息和客户端代理信息进行比较,若不相等就抛出异常(Cas的安全策略)。
- 回到问题的根源,当业务系统调用Cas的Rest接口实现登陆,再切换到其他单点登录系统时,先请求Cas的登陆授权页面,当程序调用this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request)获取TGT时,此时客户端的TGC为空自然无法解析出TGT。
- 思考:既然调用Rest接口实现登陆有返回TGT信息,是否可以再请求一遍Cas的登陆授权页面并传入TGT信息,然后修改源码将TGT加密为TGC并加入到客户端的cookie中,此时Cas认定为当前用户为已登陆并重定向回service地址。
- Cas的登陆授权页面需要改造获取传入的TGT信息,还是需要到InitialFlowSetupAction类的doExecute方法进行处理
WebUtils.putTicketGrantingTicketInScopes(context, this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request));
String cookie = this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request);
//增加从request中获取tgt
if (cookie == null && request.getRequestURI().contains("/login")) {
String tgt = request.getParameter("tgt");
if (StringUtils.isNotBlank(tgt)) {
HttpServletResponse response = WebUtils.getHttpServletResponse(context);
//TGT生成为TGC并添加客户端cookie中
this.ticketGrantingTicketCookieGenerator.addCookie(request, response, tgt);
//tgt直接付值给cookie
cookie = tgt;
}
}
WebUtils.putTicketGrantingTicketInScopes(context,cookie);
<on-start>
<evaluate expression="initialFlowSetupExAction"/>
</on-start>
Cas 4.2.7 OAuth+Rest 实现SSO的更多相关文章
- (转)《SSO CAS单点系列》之 实现一个SSO认证服务器是这样的!
上篇我们引入了SSO这个话题<15分钟了解SSO是个什么鬼!>.本篇我们一步步深入分析SSO实现机理,并亲自动手实现一个线上可用的SSO认证服务器!首先,我们来分析下单Web应用系统登录登 ...
- SSO单点登录和CAS
一.单点登录流程 =====客户端====== 1.拦截客户端的请求判断是否有局部的session 2.1如果有局部的session,放行请求. 2.2如果没有局部session 2.2.1请求中有携 ...
- CAS+SSO原理浅谈
http://www.cnblogs.com/yonsin/archive/2009/08/29/1556423.htmlSSO 是一个非常大的主题,我对这个主题有着深深的感受,自从广州 UserGr ...
- cas 单点登录(SSO)之一: jasig cas-server 安装
cas 单点登录(SSO)实验之一: jasig cas-server 安装 参考文章: http://my.oschina.net/indestiny/blog/200768#comments ht ...
- CAS实现单点登录SSO执行原理及部署
一.不落俗套的开始 1.背景介绍 单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS框架:CAS(Centra ...
- CAS实现单点登录SSO执行原理探究超详细
一.不落俗套的开始 1.背景介绍 单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS框架:CAS(Centra ...
- SSO之安装CAS Server
JA-SIG CAS(Central Authentication Service)为Web应用系统提供了单点登录服务.它的特性包括:一个开放和具有很好文档支持的协议:一个Java开源服务器组件:提供 ...
- cas 单点登录(SSO)之中的一个: jasig cas-server 安装
cas 单点登录(SSO)实验之中的一个: jasig cas-server 安装 參考文章: http://my.oschina.net/indestiny/blog/200768#comments ...
- 聊聊单点登录(SSO)中的CAS认证
SSO介绍 背景 随着企业的发展,一个大型系统里可能包含 n 多子系统, 用户在操作不同的系统时,需要多次登录,很麻烦,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录. web 系 ...
随机推荐
- LeetCode Array Easy 283. Move Zeroes
Description Given an array nums, write a function to move all 0's to the end of it while maintaining ...
- 【记录】ELK之logstash同步mysql数据到Elasticsearch ,配置文件详解
本文出处:https://my.oschina.net/xiaowangqiongyou/blog/1812708#comments 截取部分内容以便学习 input { jdbc { # mysql ...
- shell字符串的空值检查
- 命令分析nginx访问日志的用法
awk分析日志常用高级使用命令方法 分析访问日志(Nginx为例) 日志格式: '$remote_addr - $remote_user [$time_local] "$request&qu ...
- 转载:java面试题(二)
这部分主要是开源Java EE框架方面的内容,包括Hibernate.MyBatis.Spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试题, ...
- 12.Unsafe原子性操作
import sun.misc.Unsafe; /** * JDK8 * JDK 的此jar 包中的 Unsafe 类提供了硬件级别的原子性操作 */ public class UnsafeTest ...
- 【Java架构:基础技术】一篇文章搞掂:Spring Boot 官方文档解读
本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文内容大部分是翻译和总结官方文档,可以到https://docs.spring.io/spring-boot/docs查看(此地 ...
- app = Flask(__name__) 是个什么东西
"""第一部分,初始化:所有的Flask都必须创建程序实例, web服务器使用wsgi协议,把客户端所有的请求都转发给这个程序实例 程序实例是Flask的对象,一般情况下 ...
- Android数字签名的学习(转)
转载地址:http://www.cnblogs.com/feisky/archive/2010/01/17/1650076.html 在Android系统中,所有安装到系统的应用程序都必有一个数字证书 ...
- python基础三(深浅拷贝)
1.赋值操作 list_1 = [1,2,3,['barry','Jerry']] list_2 = list_1 list_1[0] = 111 print(list_1) # [111, 2, 3 ...