PHP单点登录--源码--详细解析

最近在搞单点登录,此前从来都没有接触过,那么就直接说了,不废话了。

单点登录的概念:一个地方登录了,其它地方都不需要登录。

首先,我用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服务器重定向到要访问的页面

你可能感兴趣的:(php)