php用cas实现sso单点登陆及登出功能
一..cas服务器搭建
cas服务器端下载地址:http://downloads.jasig.org/cas/
解压cas-server-4.0.0-release.zip将modules目录下的cas-server-webapp-4.0.0.war改名称为cas.war复制到tomcat的webapps下,启动tomcat,访问:http://localhost:8080/cas/login 就可以看到登录界面了:
cas服务端默认采用的是 用户名=密码的验证,并且采用的是https验证,需要给tomact配置证书,本系统没有采用https验证,若采用https验证可参考:
http://blog.csdn.net/haydenwang8287/archive/2010/07/26/5765941.aspx
1.若不采用http验证,服务器需配置如下:
找到文件cas/web-inf/deployerconfigcontext.xml的如下内容:
增加参数p:requiresecure=false,是否需要安全验证,即https,false为不采用,加上去之后,如下:
找到文件:cas/web-inf/spring-configuration/ticketgrantingticketcookiegenerator.xml的如下内容:
参数p:cookiesecure=true,同理为https验证相关,true为采用https验证,false为不采用https验证。
参数p:cookiemaxage=-1,简单说是cookie的最大生命周期,-1为无生命周期,即只在当前打开的ie窗口有效,ie关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意ie窗口,都不需要验证。
服务器端退出地址:http://localhost:8080/cas/logout,如图:
若希望退出后能返回则需要配置服务端cas-servlet.xml配置
增加属性 p:followserviceredirects=true
退出链接为:http://localhost:8080/cas/logout?service=http://localhost:8080/casclient/index.jsp
2.更改服务器验证方式,采用数据库验证修改配置文件deployerconfigcontext.xml,加dbcp连接池:(以oracle为例)
oracle.jdbc.driver.oracledriverjdbc:oracle:thin:@192.168.18.26:1521:orcltesttest
需要的jar包有:(cas-server-support-jdbc-3.4.4.jar,commons-dbcp-1.2.1.jar,commons-pool-1.3.jar,ojdbc14_g.jar)
配置加密方式,cas内置的有md5加密,也可以写自己的加密类,实现org.jasig.cas.authentication.handler.passwordencoder接口即可:
注释掉默认的验证方式,采用数据库查询验证:
服务器配置完成
二.配置php客户端
php客户端下载地址:http://downloads.jasig.org/cas-clients/php/,目前最新版本为cas-1.2.0.orc2
新建项目:phpcasclient.将cas文件夹和cas.php复制到工程中,修改cas/client.php,将其中的https改为http,新建php文件:user.php,此文件用于处理单点登陆,内容如下:
http://localhost/phpcasclient/user.php?a=login); phpcas::logout($param); } /** * @desc logincas()单点登陆 */ public function logincas(){ header('p3p:cp=idc dsp cor adm devi taii psa psd ivai ivdi coni his our ind cnt'); //引人cas include 'cas-1.2.0/cas.php'; // initialize phpcas //phpcas::client(cas_version_2_0,'服务地址',端口号,'cas的访问地址'); phpcas::client(cas_version_2_0,192.168.142.1,80,/cas,true); //可以不用,用于调试,可以通过服务端的cas.log看到验证过程。 // phpcas::setdebug(); //登陆成功后跳转的地址 -- 登陆方法中加此句 phpcas::setserverloginurl(https://192.168.142.1:80/cas/login?embed=true&cssurl=http://localhost/phpcasclient/style/login.css&service=http://localhost/phpcasclient/user.php?a=logincas); //no ssl validation for the cas server 不使用ssl服务校验 phpcas::setnocasservervalidation(); //这里会检测服务器端的退出的通知,就能实现php和其他语言平台间同步登出了 phpcas::handlelogoutrequests(); if(phpcas::checkauthentication()){ //获取登陆的用户名 $username=phpcas::getuser(); //用户登陆成功后,采用js进行页面跳转 echo ; }else{ // 访问cas的验证 phpcas::forceauthentication(); } exit; }}?>
新建视图层,login.html,该页面即为单点登陆页面,内容如下:
单点登陆界面 请输入登陆信息:
登出
注意:php配置文件php.ini需要开启php_curl,即 找到 ;extension=php_curl.dll ,将该句前面的分号去掉即可,改为 extension=php_curl.dll此时,访问login.html,便可以看到单点登陆的界面,登陆成功后,页面跳转到home.php中.
点击 登出,控制层请求user.php的logout方法,处理登出请求.登出成功后,页面跳转到login.html,提示用户登陆
至此,php使用cas的单点登陆,登出已经操作完毕.