CAS Java客户端登录相关过滤器的处理流程
来源:互联网 发布:华为云计算视频百度云 编辑:程序博客网 时间:2024/06/03 18:24
首先了解一下CAS登录原理:
CAS结构中一般包含CAS服务器、应用服务器、客户端三个部分。客户端向应用服务器发出请求,由于未登录,会被跳转到CAS服务器登录。登录成功后跳转回应用服务器的登录前的URL,但是CAS服务器会给URL加上一个ticket参数。应用服务器拿着ticket去CAS服务器验证,验证成功后即加入一个session表示已登录,以后就不用再次登录了。
在web.xml配置中,AuthenticationFilter和TicketValidationFilter两个过滤器是负责处理登录流程的。
web.xml配置:
1、AuthenticationFilter
AuthenticationFilter中doFilter方法源码:
通过源码可以看出这个过滤器的处理流程:
如果session中包含name为"_const_cas_assertion_"的属性,也就是用户已经登录过了,则跳过此过滤器。
如果ticket参数不为空,即可能是登录后跳转回来的URL,则跳过此过滤器。(注意,AuthenticationFilter只判断ticket是否为空,并不做ticket合法校验,也就是随便输入一个ticket参数在URL中都可以通过此过滤器。而负责校验ticket的是第二个过滤器:TicketValidationFilter 。)
如果上面两个条件都不满足,也就是既没有"_const_cas_assertion_"的session又没有ticket参数,则跳转到XML配置的casServerLoginUrl,让用户到CAS Server上登录,并在URL加上一个参数service(即XML配置的serverName加上相对路径,用于登录成功后返回登录前的页面)。
下面来测试一下,web.xml先只配置一个过滤器,去掉其他过滤器:
在浏览器中输入地址http://localhost:9999/a/b/c并打开,会跳到登录页面,也就是XML中配置的casServerLoginUrl,并加上一个用于返回登录前页面的参数,这个参数由XML配置的serverName加上路径/a/b/c生成,即http://localhost:8080/cas/login?service=http://localhost:9999/a/b/c。再次页面输入用户名、密码登录,如果登录成功,则跳转到service参数指定的页面,并加上一个参数ticket,即http://localhost:9999/a/b/c?ticket=ST-12-1XGQRUtFnwtqQxdNLOdv-cas01.example.org。
这里可以再测试一下AuthenticationFilter是否校验ticket合法性。例如在浏览器中打开http://localhost:9999/a/b/c?ticket=123,其中ticket参数是随便写的,肯定不是合法的,但是访问可以直接进入页面,不再需要登录。也就是AuthenticationFilter只判断ticket是否为空,并不校验是否合法。
2、TicketValidationFilter
由于TicketValidationFilter、Cas20ProxyReceivingTicketValidationFilter都继承自AbstractTicketValidationFilter,下面看AbstractTicketValidationFilter中的doFilter方法源码:
通过源码可以看出这个过滤器的处理流程:
如果有ticket参数,校验ticket是否合法(不合法则异常:org.jasig.cas.client.validation.TicketValidationException: CAS Server could not validate ticket)。
如果合法则在session加入"_const_cas_assertion_",并再次跳转,这次跳转主要就是去掉ticket参数,即从http://localhost:9999/a/b/c?ticket=ST-12-1XGQRUtFnwtqQxdNLOdv-cas01.example.org跳转到http://localhost:9999/a/b/c。(这样做有个好处就是如果用户F5刷新页面,由于已经没有ticket参数,不会再次去校验ticket,而同一个ticket只能使用一次,再次去CAS服务器校验会出现TicketValidationException异常。)
如果没有ticket参数,则直接跳过此过滤器(没有ticket参数的话就一定是session中包含"_const_cas_assertion_"的属性,否则连第一个过滤器AuthenticationFilter都无法通过)。
整理一下整个登录流程:
第一次请求应用服务器:
当用户第一次访问应用服务器的URL,由于session中没有"_const_cas_assertion_"且参数中没有ticket,会被AuthenticationFilter跳转到CAS服务器的登录页面。
第二次请求应用服务器:
在CAS服务器的登录页面成功登录以后,会跳转到应用服务器登录前的页面,但是加上了一个参数ticket。此次请求由于有ticket参数,通过了AuthenticationFilter,但是TicketValidationFilter会对ticket进行校验,校验成功后,会在session中加入"_const_cas_assertion_",再去掉ticket参数进行一次跳转。
第三次请求应用服务器:
此时由于session中已经有了"_const_cas_assertion_",会通过AuthenticationFilter,由于没有ticket参数,也通过了TicketValidationFilter,也就是可以正常显示出这个页面了。以后再请求应用服务器就和这次一样了,由于session包含"_const_cas_assertion_"即可正常访问。
作者:叉叉哥 转载请注明出处:http://blog.csdn.net/xiao__gui/article/details/38082761
- CAS Java客户端登录相关过滤器的处理流程
- CAS Java客户端登录相关过滤器的处理流程
- Cas客户端业务系统自动登录处理
- 构造CAS客户端的登录Servlet
- CAS 客户端登录验证
- CAS客户端认证流程
- cas客户端验证流程
- CAS登录流程详解
- CAS 登录流程
- cas 单点登录流程
- CAS客户端过滤器源码备忘
- cas实现单点登录,登出(java和php客户端)
- 基于CAS的单点登录SSO[4]: 加入两个CAS客户端测试单点登录
- CAS python 客户端登录分析
- Cas单点登录客户端配置
- Cas单点登录的服务器端和客户端的配置
- Cas单点登录的服务器端和客户端的配置
- CAS单点登录执行流程
- gdb使用技巧总结
- 常用 Git 命令清单
- VUE 2.0 思维导图v1
- 几个css函数的妙用
- CentOS7下启动Nginx报错解决办法
- CAS Java客户端登录相关过滤器的处理流程
- onload事件和ready事件的区别
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource'
- ssm框架面试题
- EventBus 源码解析
- leetcode: 606. Construct String from Binary Tree
- oracle 分区表放入不同的表空间
- Spring Boot 之Spring Boot Starter依赖包及作用
- 仿千牛登录