学习笔记-CAS实现单点登录(单点登录 cas oauth2)
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的打包方式及自定义配置登录页的方法,欢迎大家转载+关注!