Single Sign On,简称SSO,是目前比较流行的企业业务的解决方案之一,
sso是得多个应用系统,用户只需要登录一次就可以访问所有相互信任的应用系统
在了解sso之前,我们先了解下session和cookie
session和cookie都是用来存储特定用户所需的属性以及配置信息文件
session :
是在服务器端保存一个数据结构,用来跟踪用户状态,这个数据可以保存在集群,数据库,文件中。
Session文件的创建和使用都是在服务器端,浏览器没有权限获得session文件,浏览器只能通过获得的Session ID来发送“请求”获取相关信息。
cookie:
是在客户端保存用户信息的一种机制,用来记录用户信息
CAS分为两部分CAS Server和CAS Client
CAS Server : 需要单独部署,主要负责对用户的认证工作
CAS Client : client与受保护的客户端应用部署在一起,以Filter方式保护受保护的资源。cas client会分析http请求是否携带Service Ticket 如果没有,则说明当前用户尚未登陆,于是将请求重定向到指定好的cas server登陆地址,并传递service(也就是要访问的目的资源地址)
TGT:Ticket Granting Ticket
TGT 是CAS 为用户签发的登录 ticket,也是用于验证用户登录成功的唯一方式。 TGT 封装了 Cookie 值以及 Cookie 值对应的用户信息,CAS 通过 Cookie 值(TGC)为 key 查询缓存中有无 TGT(TGC:TGT(key:value)),如果有的话就说明用户已经登录成。
TGC:Ticket Granting Cookie
CAS 会将生成的 TGT 放在 session 中,而 TGC 就是这个 session 的唯一标识(sessionId),可以认为是 TGT 的key,为 TGT 就是 TGC 的 value,TGC 以 cookie 的形式保存在浏览器中,每个请求都会尝试携带 TGC。(每个服务都会在 session 和 cookie 中保存对应的 TGT 和 TGC)
ST:Service Ticket
ST 是当用户访问某一服务时提供的 ticket。用户在访问其他服务时,发现没有 cookie 或 ST ,那么就会302到 CAS 服务器获取 ST。然后会携带着 ST 302 回来。
作者:司鑫
链接:https://www.jianshu.com/p/d836afe95698
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1. 用户首次登录,通过浏览器访问系统A,此时系统A将重定向到CAS-SERVER,判断是否有cookie TGC,发现没有重定向到CAS-SERVER的login登录页面。并且带有URl即原始系统地址,以便认证通过跳转
https://localhost:8080/cas/login?service=http://localhost:8081/cas-client
2. 在登录页面输入账号密码认证,认证成功后到cas-server生成TGT,在用TGT生成ST,再重定向返回ST和cookie(TGT)到浏览器
3. 浏览器带着ST访问想要访问的地址
http://localhost:8081/?ticket=ST-25939-sqbDVZcuSvrvBC6MQlg5
4. 浏览器的服务器收到ST后带着再去SERVER验证是否是自己签发的,通过后显示信息
首次登录完毕
5.在登录另一个接入CAS的系统B,重定向到CAS-SERVER,判断是否有cookie(TGC),此时有TGC不跳转登录页面,但此时没有ST,去CAS-SERVE申请一个
http://localhost:8080/cas/login?service=http://localhost:8082&&TGC(cookie)(传目标地址和cookie)
6. cas-server生成了ST后重定向给浏览器
http://localhost:8082/?ticket=ST-25939-sqfsafgefesaedswqqw5-xxxx
7. 浏览器的服务器收到ST后再去cas-server验证一下是否为自己签发的,验证通过后就会显示页面信息(同第4步)
Cas Clinet端:通过是由一系列的Filet过滤器组成的
cas api:https://github.com/apereo/java-cas-client
Cas Clinet 中的过滤器:
CAS身份验证过滤器: 如果需要认证用户,它将把用户重定向到CAS服务器
AuthenticationFilter
Saml11AuthenticationFilter
协议验证票证:
Cas10TicketValidationFilter (CAS 1.0协议验证票证)
Saml11TicketValidationFilter(SAML 1.1协议验证票证)
Cas20ProxyReceivingTicketValidationFilter(CAS 2.0协议验证票证)
Cas30ProxyReceivingTicketValidationFilter(使用CAS 3.0协议验证票证)
Cas30JsonProxyReceivingTicketValidationFilter(使用CAS 3.0协议验证票证,但该过滤器仍能够接受来自CAS的验证响应,该验证响应按照CAS协议制定的指南格式为JSON)
CAS HttpServletRequest包装过滤器 :返回CAS相关条目
AssertionThreadLocalFilter:将Assertion放置在ThreadLocal需要访问它的应用程序部分中
CAS错误重定向过滤器:DelegatingFilterProxy