首页 > 代码库 > CAS 单点登录

CAS 单点登录

首先,何谓单点登录。单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
cas登录系统中有两个角色,一个是cas server 就是提供登录服务,登录页面,client 校验的一个web应用。
一个是cas client,使用过滤器,在客户应用呗访问的时候会先判断该系统是否登录,无登录则直接重定向到cas server服务上。

在CAS中MVC的控制主要是使用的spring MVC来实现的。但是,在登录过程中,因为有点类似于工作流的性质,所以,采用了一个轻量级的工作流框架,就是spring 的weflow。下面,我们就CAS如何采用webflow控制登录流程进行分析。

想深入理解webflow工作原理的读者需要参考官方的webflow2.21版本的reference。

---------------------------------cas client 的流程----------------------------------------

cas client 使用的是过滤器。在每次浏览器访问cas celient应用之时,会先走在web.xml中配置的casFilter。他们会判断该用户是否已经登录。

如果(用户已经登陆){

doFilter;

}

如果(用户未登录,并且请求的参数中并没有携带ticket参数){

那么,将把浏览器重定向与cas server 让其去登录。

}
如果(用户未登录,并且请求中携带了ticket参数){
那么,cas client 会在后台向 cas server 发送 一个server validate的请求。去验证这个ticket的合法性。
如果(验证成功){
创建session,cookie 并认为该客户是已经登录状态。
}
如果(验证失败){
吧浏览器重定向于 cas server 让浏览器去登录。
}
}
这就是cas 登录中,客户端的流程
而在cas登出中。已登录的所有cas client 会收到来自 cas server的一个loginoutRequest ,客户端会销毁session什么的来进行登出的操作。从而完成登出。

-------------------------------------cas server的登录流程------------------------------------
cas server 在接收到 casclient 重定向过来的login请求。会进行一系列的账号密码验证工作。
如果(登录成功){
写cookie, 将浏览器携带过来的server参数,也就是cas client应用的地址拿到,存入map(为将来的登出做准备)。
将用户重定向给cas client , 并携带ticket参数。
}否则{
毫无疑问。。重新登录吧。
}
ps:登录的操作只会登录一次。
-------------------------------------cas server的验证流程------------------------------------
接收到cas client 发送过来的验证请求,并返回过去一段xml格式的结果。代表成功,或者失败。
ps:该操作每个cas client 都会走一次。


-------------------------------------用户登录流程------------------------------------
至此,所有的流程都大概描述完毕。
那么实际登录流程是怎样呢?
我经常笑说,这种登录就是踢皮球的过程,用户会被cas server 以及cas client 各种踢来踢去。
用户(浏览器)访问 http://client/clientapp
clientapp 发现用户未登录,所以重定向给了casserver,于是用户的浏览器上的url变成了
用户(浏览器)访问http://casserver:8443/casserver?server=http://client/clientapp
用户(浏览器)输入用户密码点击提交
casserver验证结果,并将用户重定向给了server中定义的client并附送了一个ticket
用户(浏览器)访问 http://client/clientapp?ticket=xxxxxxx
casclient检测到有用户未登录,并有ticket参数。则在后台向casserver 发送了server validate请求。
casserver收到cas client 的验证请求。返回成功或者失败
casclient收到来自casserver的用户返回值,如果(成功){do filter}否则{将用户重定向到casserver 登录页面}

用户(浏览器)访问http://client/clientappB
casclient检测到用户未登录,会重定向到casserver
casserver有已经登录的cookie参数,casserver会拿到ticket并重定向给casclient
用户(浏览器)访问 http://client/clientappB?ticket=xxxxxxx
casclient检测到有用户未登录,并有ticket参数。则在后台向casserver 发送了server validate请求。
casserver收到cas client 的验证请求。返回成功或者失败
casclient收到来自casserver的用户返回值,如果(成功){do filter}否则{将用户重定向到casserver 登录页面}
但是对用户登录appB这个过程来说,只是用户(浏览器)各种被重定向的过程。也就是说,对于用户来说是透明的。于是就此实现了单点登录过程。
用户(浏览器)访问http://client/clientapp
casclient检测到用户已经登录。放行。


-------------------------------------用户登出流程------------------------------------
用户(浏览器) 访问http://client/clientapp/loginout
casclient会检测到该请求,并发送一个loginout请求到casserver
casserver收到该请求,会迭代本文红色字体那行的map,并迭代取出所有的client的url地址。
casserver迭代请求该这些url地址,并附带一个requestCode。。。忘记什么名字了,就是一个参数,表示是登出操作。
casclient接收到该参数,将session销毁,完成登出操作
casclientB接收到该参数,将session销毁,完成登出操作
用户(浏览器)被重定向到casserver 到登陆页面
至此,登出完毕。