学习笔记-CAS实现单点登录(单点登录 cas oauth2)

createh53周前 (05-08)技术教程13

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的打包方式及自定义配置登录页的方法,欢迎大家转载+关注!

相关文章

JWT在Java项目中的认证实践:从零开始打造安全高效的登录系统

JWT在Java项目中的认证实践:从零开始打造安全高效的登录系统在现代互联网开发中,安全认证是构建可靠系统的基石。而JSON Web Token(JWT)作为一种轻量级的认证机制,因其高效便捷的特点被...

OAuth2协议在实际项目中的应用:为你的应用添加“社交登录”功能

OAuth2协议在实际项目中的应用:为你的应用添加“社交登录”功能OAuth2协议在现代Web开发中扮演着至关重要的角色,它就像一把钥匙,帮你打开安全授权的大门。今天,我们就来聊聊OAuth2协议在实...

Java 自定义注解在登录验证的应用

java注解从 JDK 5开始,Java 增加了注解的新功能,注解其实是代码里面的特殊标记,这些标记可以在编译、类加载和运行时被读取,在不改变代码原有逻辑下,给源文件嵌入注解信息。再通过返回获取注解信...

Java,SpringSecurity,支持多个端认证和授权

背景和需求:一个SpringBoot项目,认证授权采用:SpringSecurity+Token(JWT)支持Web端,现需要同时并行的支持其它端的认证授权。SpringSecuritySpringS...

SpringBoot + JWT 打造无状态登录系统,让你的应用更安全高效

还在为Session共享烦恼?每次集群部署都要头疼用户状态同步?传统Cookie+Session模式在分布式场景下越来越力不从心?本文将手把手带你用SpringBoot+JWT实现无状态登录,轻松解决...