前言
单点登录(Single Sign On , 简称 SSO)是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。Yale大学CAS(Central Authentication Service)是一款不错的针对 Web 应用的单点登录框架.
使用该框架出现下面两个bug:
- logout需要刷新才能自动跳转到login
- ST(Service ticket)和URL不符
#Cookie和Session
这篇博客不错
cookie浏览器,session服务器,session安全存敏感,cookie长效不安全
#CAS
这篇博客不错
##术语
CAS的核心就是其Ticket,及其在Ticket之上的一系列处理操作。CAS的主要票据有TGT、ST、PGT、PGTIOU、PT,其中TGT、ST是CAS1.0(基础模式)协议中就有的票据,PGT、PGTIOU、PT是CAS2.0(代理模式)协议中有的票据。只关心CAS1.0
###TGT(Ticket Grangting Ticket)
sever存放的session
###TGC (Ticket-granting cookie)
broswer存放的cookie
###ST(ServiceTicket)
Cas20ProxyReceivingTicketValidationFilter验证
###之间的关系
服务器端存放Session(TGC.A->TGT1(cookie,userinfo),TGC.B->TGT2,…)
浏览器端存放Cookie(TGC(sessionid),TGC2,…)
SSO流程
没有看源码,通过理解博客内容所画,等待看过源码后发现又没有错误。
流程中注意的地方
- 配置单点登出,一定要按照SingleSignOutHttpSessionListener->SingleSignOutFilter->AuthenticationFilter->Cas20ProxyReceivingTicketValidationFilter->HttpServletRequestWrapperFilter->AssertionThreadLocalFilter的顺序
- AuthenticationFilter和Cas20ProxyReceivingTicketValidationFilter在认证或验证ST通过后可以通过设置中的serverName、service来配置重定向地址,区别是serverName可以带参数而service是固定地址。
跨域问题
##什么是跨域
这篇博客不错
JavaScript同源策略的限制
##解决
前台不用深入,几个关键点如下:
- 因为是JS的问题,后台访问没有问题
- 新版支持添加header,支持跨域。前提是response有这个头(可以后台加filter人为添加),然后ajax用指定方法访问
缓存问题
总结
针对前言中的两个bug:
1.logout
- 原来是添加了id=logout的点击事件,事件中ajax 先访问logout的servlet,servlet只清理本地缓存,然后js中访问CASlogout地址。为防止跨域问题,改为直接跳转(href)logout,然后在servlet中sendRedirect到CAS的logout。
- 经过验证,CAS顺序等配置没有问题,最后返现是chrome的缓存问题,尽管我指定了index.html中的head不缓存,但是chrome还是缓存,所以只能为CAS logout重定向地址指向如下:
String location = "https://cas.zyxing.com/caso/logout?service=http://flightlivewatch.flight.zyxing.com/index.html?timestamp=" + timestamp;
2.验证ST不符报错
- 可以设置不报错
- 根本原因是使用了短域名,导致存储的TGT和访问地址不一致,导致报错