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