# SSO & CAS
# SSO
SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。CAS是一种基于http协议的B/S应用系统单点登录实现方案,认识CAS之前首先要熟悉http协议、Session 与 Cookie 等Web开发基本知识。
# HTTP
HTTP是一个客户端和服务器端请求和应答的标准,我们全后端开发对接的Rest接口就是基于http协议。http协议包含http请求消息(HttpRequest)和http应答消息(HttpResponse)两部分。
- 理解http协议是无状态协议的含义
- 熟记常见的http协议状态码,其中302等与cas相关
- 熟记常见的http请求头,其中Cookie等与cas相关
- 熟记常见的http应答头,其中Set-Cookie、Location等与cas相关
# Session 与 Cookie 会话机制
HTTP 本身是无状态的,但是有时候我们需要HTTP请求保持状态,我们引入 Session 与 Cookie 。
Session 用在服务端,用于存储当前所有客户端要保存的状态值,并为每一个客户端生成一个唯一编码,然后通过HTTP响应头 Set-Cookie 将这个值发送给客户端。
Cookie 用在客户端,用于记录后端发送过来的唯一编码,该编码与服务端上的对用的状态值对应,在下一次请求的时候通过 HTTP 请求头 Cookie 带上这个编码,服务端就能根据这个编码获取该客户端之前记录的所有状态值。

# CAS
CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO )。
CAS Architecture (opens new window)

# 原理:两次前端跳转、一次后端验证

下面结合浏览器请求分析上图:
- 用户在浏览器中输入要访问的应用客户端地址
https://app1.leichu.top/app1/index。 - 由于客户端的
web.xml中配置了 CAS 登录的过滤器AuthenticationFilter,判断此时用户未登录,所以返回302状态码,重定向到 CAS 认证服务器,此时,浏览器跳转到 CAS 服务器的登录界面https://sso.leichu.top/cas/login?service=https://app1.leichu.top/app1/index,并且,在请求路径后面追加service=https://app1.leichu.top/app1/index作为 queryString 。这里是第一次前端跳转。 - 用户再登录界面输入用户名密码,点击提交,此时 CAS 认证服务器进行登录认证,如果登录成功,返回
302状态码,并且往Cookie中设置了一个TGC:Set-Cookie: TGC=xxxxxx。根据service参数,再次重定向回到客户端,此时的重定向地址后追加了一个ticket参数:https://app1.leichu.top/app1/index?ticket=ST-1-T2rLRl8YqFKq13sulGt-EM4S3LEleichu。这里是第二次前端跳转 - 到这里已经认证完成回到了客户端,和第二步一样, 由于客户端的
web.xml中配置了 CASticket校验的过滤器Cas30ProxyReceivingTicketValidationFilter,这里客户端会带着service和 前一步的ticket去 CAS 服务器进行校验,如果通过,则当前客户端的整个登录认证流程完成。这里的 ticket 校验,就是一次后端验证。
下面是浏览器具体的请求过程截图:





HTTPS 配置 →