学习笔记-CAS实现单点登录

CAS企业单点登录-v5.3.x

单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

CAS框架:CAS(Central Authentication Service)是实现SSO单点登录的框架。

CAS架构

 

CAS Server

CAS服务器是构建在Spring框架上的Java servlet,其主要职责是通过签发和验证票据来验证用户并授予对启用CAS的服务(通常称为CAS客户机)的访问权。当服务器在成功登录后向用户发出票据授予票据(TGT)时,将创建SSO会话。根据用户的请求,使用TGT作为令牌,通过浏览器重定向向服务发出服务票据(ST)。ST随后通过后端通道通信在CAS服务器上进行验证。

CAS Client

CAS客户机是任何支持CAS的应用程序,可以通过支持的协议与服务器通信。CAS客户端也是一个软件包,它可以与各种软件平台和应用程序集成,以便通过某种身份验证协议(例如CAS、SAML、OAuth)与CAS服务器通信。

软件组件

  • Web (Spring MVC/Spring Webflow)
  • Ticketing
  • Authentication

几乎所有的部署考虑和组件配置都涉及到这三个子系统。Web层是与所有外部系统(包括CAS客户机)通信的端点。Web层委托给票据子系统,以生成用于CAS客户机访问的票据。SSO会话开始于在成功的身份验证时签发票据授予票据,因此票据票务子系统经常委托给身份验证子系统。

CAS认证原理

核心票据

TGT(Ticket Grangting Ticket)

TGT是CAS为用户签发的登录票据。拥有了TGT,用户可以证明自己在CAS系统中登录过。用户在CAS中认证通过,会生成一个TGT对象,并保存在自己的缓存中(session)。

TGT组成(存储在CAS的session中)

  • 一个cookie值
  • cookie值对应的用户信息。

TGC(Ticket-granting cookie)

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

TGC组成(返回到浏览器,存储在cookie中)

  • TGT的对象的ID

ST(ServiceTicket)

ST是CAS为用户签发的访问某一服务票据。用户访问service时,service发现用户没有ST,则要求用户去CAS获取ST。用户向CAS发出获取ST的请求,如果用户的请求中包含cookie,则CAS会以此cookie值为key查询缓存中有无TGT,如果存在TGT,则用此TGT签发一个ST,返回给用户。用户凭借ST去访问service,service拿ST去CAS验证,验证通过后,允许用户访问资源。
为了保证ST的安全性:ST 是基于随机生成的,没有规律性。而且,CAS规定 ST 只能存活一定的时间,然后 CAS Server 会让它失效。而且,CAS 协议规定ST只能使用一次,无论 Service Ticket 验证是否成功, CASServer 都会清除服务端缓存中的该 Ticket ,从而可以确保一个 Service Ticket 不被使用两次。

认证过程

 

第一次访问CAS客户端A

步骤一

第一次访问cas客户端A,客户端中的过滤器AuthenticationFilter会拦截请求

  • 检测请求中是否存在session(浏览器和cas客户端间隔)
  • 检测请求中是否存在ST

均不存在,则请求会被重定向到CAS认证服务中,并将请求地址作为service参数传递(以便登录成功后跳转会改地址)。比如:

http://localhost:8080/cas/login?service=http://localhost:8080/gateway/aservice/api

步骤二

请求被重定向到CAS认证服务中。

  • CAS检测,请求信息中是否携带了TGC,未携带跳转至登录页进行登录。
  • 登录成功后,CAS生成TGT(包含用户信息)、TGC、ST。TGT存储在CAS服务端session中,TGC写入浏览器的cookie中,ST作为参数加在跳转连接中。

比如:

http://localhost:8080/gateway/aservice/api?ticket=ST-5-Sx6eyvj7cPPCfn0pMS

步骤三

携带ST的请求再次被CAS客户端拦截,过滤器AuthenticationFilter发现有ST,则放行,接着由TicketValidationFilter过滤器验证ST的合法性,TicketValidationFilter会发送http请求,请求CAS服务端的/serviceValidate接口,验证ST合法性,验证通过后,向CAS客户端写入用户信息的session。过滤器放行,请求成功,同时CAS服务端将用户信息写入web应用的session中。

源码展示

AuthenticationFilter过滤器发现session中有用户信息,则放行不验证

 

AuthenticationFilter过滤器发现session中无用户信息,则验证ST是否存在

 

TicketValidationFilter发送http请求到CASserver端,验证ST有效性

 

AbstractTicketValidationFliter过滤器验证ST合法后,写入用户信息到客户端session中

 

第二次访问CAS客户端A

用户在同一浏览器里第二次访问此web 应用(CAS—Client1)时,AuthenticationFilter会在session 里读取到用户信息,这就代表用户已成功登录,所以就不会去CAS 认证了。

第一次访问CAS客户端B(A系统已登录)

步骤一

同“第一次访问CAS客户端A”步骤一。

步骤二

由于请求中携带了TGC,服务端根据TGC查找TGT,如果存在则登录过,TGT签发ST重定向到客户端。

步骤三

同“第一次访问CAS客户端A”步骤三


近期会更新发布CAS的打包方式及自定义配置登录页的方法,欢迎大家转载+关注!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值