本篇文章将讨论CasClient的两个过滤器AuthenticationFilter和TicketValidationFilter 。这两个过滤器将按先后顺序配置在需要使用到SSO的应用服务中。
一.AuthenticationFilter
这个过滤器判断用户是否已登录,若没有,则重定向到CasServer。
主要的业务逻辑都在doFilter方法,里面有几个变量注意下:
assertion:代表了一个验证请求的响应,里面封装了验证时间,验证主体(Principal)等信息。
ticket:代表了访问一个应用服务所需的票据。
wasGatewayed:不明白具体的意义,只知道是根据保存在session中的一个属性值来判断的一个boolean类型的值,当用户初次访问应用服务并且未登录的时候为false,在casclient重定向到casserver时,若过滤器的gateway参数为true的时候,会设置对应session中的属性值,这样在第二次经过这个过滤器的时候就会为true了。而当从这个过滤器到下一个过滤器之前,又会清空session中对应的属性值,这样在第三次经过这个过滤器的时候又为false了~~
这个过滤器的基本流程如下图所示:
二.TicketValidationFilter
这个过滤器是用来转发验证浏览器传来的Ticket的。Cas中实际上是没有这个类的,但是有几个备选的实现类:Cas10TicketValidationFilter,Saml11TicketValidationFilter,Cas20ProxyReceivingTicketValidationFilter。它们分别对应了不同的协议,这里我们也不管这些具体的实现类,我们看它们的共有的父类:AbstractTicketValidationFilter,在这个类的doFilter方法中会先调用一个preFiilter方法,这个方法我们除了Cas20ProxyReceivingTicketValidationFilter有具体的实现外,其他两个都是空实现。我们先认为这个方法都返回true。这个过滤器的基本流程如下图所示:
看完了这两个过滤器的实现,我们最后看下,一个用户请求从未登录状态访问A应用的页面,被重定向到到CasServer登录,接着访问其他的页面,然后再访问B应用的页面会如何经过这两个过滤器。