25期 单点登录与CAS

Posted 海致前端

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了25期 单点登录与CAS相关的知识,希望对你有一定的参考价值。

1. 前置知识 

 在阅读本文之前,需要对以下知识有所了解:

    cookie和session、浏览器同源策略及跨域、登录系统的构成

2. SSO

    SSO是英文Single Sign On 的缩写,直接翻译过来就是单点登录。

    为什么需要单点登录,一般来说,一家公司会有几个Server,假如每个Server的账户系统不一样,那么用户在使用公司的不同Server就都需要注册登录,就好比你在使用豆瓣FM、豆瓣读书、豆瓣影评等等,每个都需要重复的进行登录,那该是有多么的崩溃。此时单点登录的作用就来了,单点登录就是让用户在一个Server钟登录后,进入其他的Server不用重新进行登录,登出也是一样的。

    使用单点登录不仅可以提高用户体验,同时也可以避免重复开发,减轻我们开发人员的负担,所有业务都使用同一个登录系统,那么只需要维护这一份登录代码即可。

3. SSO的实现 

3.1 同域名不同目录

    此时不同业务系统可以直接拿到cookie,然后通过cookie去验证用户信息。

25期 单点登录与CAS

3.2 同父域

    同父域只是同域名单点登录的简单升级,不同的是,需要把cookie写入父域之中。子域是可以拿到父域的cookie。此时本质上和同域sso是没有区别的。

3.3 跨域

    当业务系统属于不同域的时候,cookie没法共享,就没法通过以上两种方法实现SSO了。下面就介绍解决这个问题的其中一个方案CAS。

4. CAS 

4.1 CAS是什么

    CAS是Central Authentication Service的缩写,中央认证服务,一种独立开放指令协议。

4.2 CAS术语

    Client:客户端

    Server:中心服务器,就是专门负责登录认证的服务器

    Service:需要登录的各个服务,也就是不同的业务系统

4.3 票据

    TGT:Ticket Grangting Ticket 

    TGT 是 CAS 为用户签发的登录票据,拥有了 TGT,用户就可以证明自己在 CAS 成功登录过。TGT 封装了 Cookie 值以及此 Cookie 值对应的用户信息。当 HTTP 请求到来时,CAS 以此 Cookie 值(TGC)为 key 查询缓存中有无 TGT ,如果有的话,则相信用户已登录过。

    TGC:Ticket Granting Cookie

    CAS Server 生成TGT放入自己的 Session 中,而 TGC 就是这个 Session 的唯一标识(SessionId),以 Cookie 形式放到浏览器端,是 CAS Server 用来明确用户身份的凭证。

     ST:Service Ticket 

     ST 是 CAS 为用户签发的访问某一 service 的票据。用户访问 service 时,service 发现用户没有 ST,则要求用户去 CAS 获取 ST。用户向 CAS 发出获取 ST 的请求,CAS 发现用户有 TGT,则签发一个 ST,返回给用户。用户拿着 ST 去访问 service,service 拿 ST 去 CAS 验证,验证通过后,允许用户访问资源。

    为了保证ST的安全性:ST 是基于随机生成的,没有规律性。而且,CAS规定 ST 只能存活一定的时间,然后 CAS Server 会让它失效。而且,CAS 协议规定ST只能使用一次,无论 Service Ticket 验证是否成功, CASServer 都会清除服务端缓存中的该 Ticket ,从而可以确保一个 Service Ticket 不被使用两次。

4.4 简单场景

    以上就是CAS的简单场景流程,然而,上面过程是没有考虑到前后端分离的情况的,在前后端场景下会存在一些坑。

5. 前后端分离与CAS

5.1 前后端分离的分类

    a. 开发阶段使用dev-server,生产阶段是打包成静态文件整个放入后端项目中。

    b. 开发阶段使用dev-server,生产阶段是打包成静态文件放入单独的静态资源服务器中。

    这两种方案最大的区别就是生产阶段。由于第一种方案前端和后端本质在同一个服务中的,所以压根就没有跨域,配置cas的坑比较少。而第二种方案我们一般使用nginx反向代理完成跨域,配置cas的坑会很多。为了后面分析方便,我们分别称上述两种方案为『前后端分离A』和『前后端分离B』

5.2 请求分类

    AJAX(XMLHttpRequest)请求:这是浏览器内部的XMLHttpRequest对象发起的请求,浏览器会禁止其发起跨域的请求,主要是为了防止跨站脚本伪造的攻击(CSRF)。

5.3 问题

问题1:前后端跨域导致前端cookie获取失败,解决方案: 保证cookie的域一致。

    对于前后端分离A方案,本身就是没有跨域的,所以cookie没有跨域。对于前后端分离B方案来说就存在跨域的问题,通过反向代理,让前端和后端服务器或者SSO单点服务器存在于同一个根域下面,SSO服务器把cookie写入这个根域就可以保证cookie同域。

问题2:cookie过期,AJAX请求重定向失败,解决方案:重定向需要封装在状态200中,前端通过window.location进行重定向

    只有HTTP请求才能进行重定向,ajax请求浏览器是无法进行重定向的,所以在前后端分离的项目中,后端需要对重定向结果进行封装,前端根据返回的结果进行页面跳转。


说到底,在前后端分离项目中,解决上面问题无非就是保证cookie同域,使用http请求进行重定向或者把重定向信息封装一下。


    以上,就是本文的全部啦。由于水平和经验有限,如有纰漏或建议,欢迎留言。如果觉得不错,欢迎关注海致星图,谢谢您的阅读。


以上是关于25期 单点登录与CAS的主要内容,如果未能解决你的问题,请参考以下文章

分布式会话与单点登录SSO系统CAS,包含完整示例代码实现

CAS搭建单点登录Web端

cas单点登录怎么在服务器端获得用户信息

Shiro单点登录之集成CAS

Shiro单点登录之集成CAS

CAS 单点登录原理解析