最近在搞单点登录,此前从来都没有接触过,那么就直接说了,不废话了。
单点登录的概念:一个地方登录了,其它地方都不需要登录。
首先,我用php实现单点登录不仅仅只是实现,还有理解,还有配置tomcat,CAS服务器等。
php用到的是phpcas库,他可以用来与CAS服务器做对接。
首先整体说下phpcas实现的过程,然后再来细讲源码。
1、phpcas首先判断session,因为登录成功的话phpcas是将CAS服务器返回的内容放在session中的,
如果session不存在的话,会重写向302到CAS服务器登录页面。
2、登录成功时,CAS服务器重写向到访问的地址,并且带上了TGC和ST这两个东西,往下细讲。
3、浏览器带着ST再去客户端访问,客户端拿着这个ST作为TICKET到CAS服务器端进行验证
4、验证成功后则允许访问,否则直接重定向到CAS服务器登录
以上是大概的四个方面,现在来根据源码细讲一下这个原理过程。
phpCAS::client(CAS_VERSION_2_0,'localhost',8443,'cas',true);
上面的代码是用来创建一个PHPCAS客户端实例的,也是PHP用来与CAS通信的基本信息,应该很好懂,
localhost 是CAS服务器的域名,注意IP地址最好不要填,后面的8443是端口,cas是目录,true是开启ssl验证
第一个参数源码中给出以下几个选择:
CAS_VERSION_1_0 CAS_VERSION_2_0 两个不同的版本
当些静态方法被调用时,会创建一个实例:
self::$_PHPCAS_CLIENT = new CAS_Client(
$server_version, false, $server_hostname, $server_port, $server_uri,$https,
$changeSessionID
);
这个实例将基本传数都设置好了,并且赋值给了一个私有变量$_PHPCAS_CLIENT提供对外访问
实例化好了之后,最主要的部分就是进行验证登录状态
phpCAS::forceAuthentication();
此方法就是用来验证登录状态的,具体分析如下:
源码做的第一步是记录回溯跟踪,这个后面都不说了
接着判断_PHPCAS_CLIENT是不是对象,也就是说这个phpcas类有没有初始化
接着调用 方法:forceAuthentication()进行验证
源码主要部分如下:
if ( $this->isAuthenticated() ) {
// the user is authenticated, nothing to be done.
phpCAS::trace('no need to authenticate');
$res = true;
} else {
// the user is not authenticated, redirect to the CAS server
if (isset($_SESSION['phpCAS']['auth_checked'])) {
unset($_SESSION['phpCAS']['auth_checked']);
}
$this->redirectToCas(false/* no gateway */);
// never reached
$res = false;
}
先判断isAuthenticated是否验证,其实里面是判断SESSION
public function isSessionAuthenticated ()
{
return !empty($_SESSION['phpCAS']['user']);
}
发现为空之后,重定向到CAS服务器进行登录。
登录成功后的流程:
登录成功后,CAS服务器向浏览器发送了两个COOKIE值,一个叫TGC,一个叫ST
TGC,他就是一个普通的COOKIE值,tomcat设置在前端浏览器中是叫JSESSIONID,用来匹配CAS服务器中TGT的session文件
ST,访问资源的唯一认证标识,也就是说访问资源要用它来进行访问,并且ST是一次性的,还有过期时间的,也就是说
CAS服务器为了保证安全性不允许此ST被用两次,会在有效期内进行判断,超过有效期会将此ST在CAS服务器上清除掉
接着,浏览器拿到了ST跟TGC后,将ST以KEY为ticket的值传给要访问的页面
要访问的页面进行验证并且带上ticket到CAS服务器进行验证,验证成功后ST失效,并且重定向到要访问的页面
登录成功后,如果CAS服务器有返回一些基本信息的话,都是存在的session当中,并且以ST作为sessionid传给前端浏览器
访问其它系统免登录
当登录成功之后,访问CAS服务器上其它子系统时即可免登录,实现流程如下:
1、访问时客户端照样重定向到CAS服务器,因为没有检测到SESSION
2、CAS服务器发现浏览器有TGC,也就是TGT的sessionid可以这么理解,但是没有ST(验证TGT)
3、CAS服务器需要TGC来生成一个随机的ST,然后返回给浏览器
4、浏览器拿到ST后在重定向到要访问的页面并且带上ticket参数,phpcas用此参数到CAS服务器验证
5、验证通过后CAS服务器重定向到要访问的页面