CAS单点登录原理解析

1 概要介绍

单点登录是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。CAS是目前Java服务器环境下使用最为广泛的单点登录实现方案。
CAS单点登录原理解析
上图是3个登录场景,分别是:第一次访问http://2rd-app.com(简称2rd)、第二次访问http://2rd.com以及登录状态下第一次访问http://3rd-app.com(简称3rd)。下面详细说明图中每个数字标号做了什么。

2.1 用户第一次访问2rd

用户第一次访问2rd的流程如下:

  1. 用户第一次访问2rd,2rd验证其是否登录,如果没有登录,则跳转到http://sso.com(简称sso);

  2. 用户未登录,浏览器返回状态码302,然后让浏览器重定向到sso并且通过在url上添加参数service=2rd,该参数的目的是登录之后要重定向回2rd,因此需要该参数;

  3. 用户访问sso,sso发现浏览器的cookie中没有TGC(sso根据cookie中的TGC来判断用户是否登录过,是否需要展示登录界面),认为用户未登录,则显示出登录页面,用户输入账号密码进行登录;

  4. 用户登录成功后,sso返回给浏览器302状态码,重定向的地址就是上文提到的service参数对应的值2rd并且在url上添加参数ticket(只有在sso中登录成功后,sso才会派发一个ticket,该参数被2rd用来验证用户是否合法),同时在cookie中设置一个TGC,TGC的作用上文已提到;

  5. 用户重新访问2rd并在url携带参数ticket;

  6. 2rd从url上解析出ticket,然后在后台通过http的方式向sso验证此ticket是否有效;

  7. 验证ticket有效后,2rd认为用户已登录并在2rd的session中设置登录状态,并将用户信息等相关资源展现在浏览器上。

2.2 用户第二次访问2rd

在2.1节中,用户已经访问过一次2rd并且登录成功了,当第二次访问2rd的时候发生了什么呢?

  1. 用户重新访问2rd,因为2rd在用户第一次登录成功后会在session中保存用户信息,因此2rd认为用户已登录,不会再向sso发送请求验证;

  2. 用户通过2rd的权限验证,浏览器正常返回资源。

2.3 用户在登录状态下第一次访问3rd

  1. 用户正在浏览2rd系统,突然想访问3rd,于是发起了访问3rd的请求;
  2. 3rd接收到请求,发现是用户第一次访问,于是浏览器返回302,让浏览器重定向到sso;
  3. 用户访问sso并在url中携带service=3rd,在cookie中携带TGC;
  4. sso发现用户请求的时候在cookie中携带了TGC,通过验证TGC确认该用户已登录,便使浏览器返回302状态码,重定向回3rd,并在url中携带sso生成的一个ticket;
  5. 浏览器重定向到3rd并在url携带参数ticket;
  6. 3rd解析出url中的参数ticket,然后在后台通过http的方式向sso验证此ticket是否有效;
  7. 验证ticket有效后,3rd认为用户已登录并在3rd的session中设置登录状态,并将用户信息等相关资源展现在浏览器上。

2.4 总结

至此,CAS单点登录的流程就结束了。