CAS学习笔记(四)

这篇博客详细记录了CAS认证系统的工作流程,从用户第一次访问开始,经过AuthenticationFilter重定向到CAS服务器,再到Spring MVC的处理,深入探讨了LoginTicket和TicketGrantingTicket(TGT)的生成过程,涉及Webflow配置文件、cas-servlet.xml以及核心接口CentralAuthenticationService的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CAS源码还是比较复杂的,通过几天的学习,整理了CAS的工作流程。

一、第一次访问

1、浏览器访问:https://localhost:8443/App1

2、客户端:AuthenticationFilter filter 发现Session中无 Assertion,且URL中无 ticket 变量。生成 service url 变量, 并重定向
到:https://localhost:8443/cas/login?service=http://localhost:8443/ App1

AuthenticationFilter 的主要功能:

if(url中无ticket参数&&session中没有TicketValidationFilter配置的assertion 对象){
response.sendRedirect(cas 服务器的/login 接口);
// 生成service 参数,添加到url 后面
            }else{不做处理}

3、服务器端:默认访问服务器端的index.jsp,下面我们来看一下其内部的代码:

<%
final String queryString = request.getQueryString();
final String url = request.getContextPath() + "/login" + (queryString != null ? "?" + queryString : "");
response.sendRedirect(response.encodeURL(url));%>

这里进行的处理就是将用户的请求重定向到CAS认证中心的 /login 路径下,根据web.xml的配置,由org.jasig.cas.web.init.SafeDispatcherServlet 进行处理。

我们看到DispatcherServlet类的完整路径是org.springframework.web.Servlet. DispatcherServlet,这里,也就是将请求交给了spring MVC处理了。

Spring MVC的核心文件是cas-servlet.xml.这个文件的作用是将webflow和springMVC进行集成。那么Spring是什么时候开始加载cas-servlet.xml文件呢?原来,在初始化DispatcherServlet的时候,会自动加载 servlet-name+“-servlet.xml”文件。所以,cas-servlet.xml是自动加载的,不需要在配置文件进行配置。(参见关于springMVC的文章)。

Webflow配置文件及源码分析

在WEB-INF文件夹下的login-webflow.xml是登陆流程的主要配置文件。在该文件中,定义了用户登录的整个处理流程。

涉及到的结点有on-start 流程开始
end-state流程结束 decision-state判断,类似于if

view-state对应jsp页面 action-state对应执行程序的某段
里面的这些定义在cas-servlet.xml中

view-state里面的view定义在default_views.properties中

Webflow.xml对用户携带的信息进行判断,是首次登陆且携带service。则生成LoginTicket:

下面深入看一下LoginTicket是如何产生的:

Webflow调用generateLoginTicketAction类中的generate方法,这个类在哪里呢?需要在cas-servlet.xml进行匹配。

这里写图片描述

cas-servlet.xml:

这里写图片描述

这里有一个loginTicketUniqueIdGenerator的关联类,LoginTicket的类型,长度定义位于\cas\WEB-INF\ spring-configuration目录下的uniqueIdGenerators.xml文件中:

这里写图片描述

当然,这个文件定义了CAS中所有票据的参数。
下面看一下GnerateServiceTicketAction.java的generate方法:

这里写图片描述

而UniqueTicketIdGenerator的实现类是DefultuniqueTicketIdGenerator:

这里写图片描述

cas-servlet.xml文件根据返回值generate将页面跳转到CAS的统一登陆界面

这里写图片描述

4、用户输入username/password,点击登陆
5、触发webflow.xml中的submit事件,调用authenticationViaFormAction.java中的dobind方法,然后调用authenticationViaFormAction.java中的submit方法(验证LoginTicket的一致性,如果已经登陆过(含有TGT),则产生ST,第一次登陆则产生新的TGT)

由于我们是第一次登陆,产生了新的TGT,下面我们看一下TGT的产生过程:

authenticationViaFormAction.java调用
this.centralAuthenticationService.createTicketGrantingTicket(credentials)

PS:centralAuthenticationService是CAS的核心接口,他定义了CAS的中核心的一些行为,其中包括:

createTicketGrantingTicket 该方法主要是验证认证信息,生成TGT。

grantServiceTicket 该方法主要是生成ST

validateServiceTicket 该方法主要是验证ST有效性。

destroyTicketGrantingTicket 该方法主要是销毁TGT

delegateTicketGrantingTicket 该方法主要是代理票据的生成

该接口的默认实现是 CentralAuthenticationServiceImpl.java

我们看一下 CentralAuthenticationServiceImpl.java ,TGT的具体实现:

这里写图片描述

这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值