cas实现单点登录,登出(java跟php客户端) (转)
最近项目中需要做单点登录,客户端包含java和php,java有几个应用程序,php是discuz+supesite+ucenter,需
?
要这几个客户端都要能单点登录和登出,在网上找了许多相关资料,今天终于配置成功,步骤如下:
?
1、cas服务端:下载地址:http://downloads.jasig.org/cas/,cas的服务端和客户端有许多版本,最新版本和老版本
?
有很大的区别,目前服务端最新版本为:cas-server-3.4.4-release.zip
?
解压cas-server-3.4.4-release.zip将modules目录下的cas-server-webapp-3.4.4.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.1、若不采用https验证,服务器端需要配置
1、cas\WEB-INF\deployerConfigContext.xml
?
?增加参数p:requireSecure="false",是否需要安全验证,即HTTPS,false为不采用,加上去之后如下:
?
?
2、cas\WEB-INF\spring-configuration\
ticketGrantingTicketCookieGenerator.xml
????? p:cookieSecure="true"
????? p:cookieMaxAge="-1"
????? p:cookieName="CASTGC"
????? p:cookiePath="/cas" />
?
参数p:cookieSecure="true",同理为HTTPS验证相关,TRUE为采用HTTPS验证,FALSE为不采用https验证。
参数p:cookieMaxAge="-1",简单说是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的IE窗口有效,IE关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意IE窗口,都不需要验证。
?
1.2、服务器端退出访问:http://localhost:8080/cas/logout,
?
?
若希望退出后能返回则需要配置
服务端cas-servlet.xml配置
增加属性 p:followServiceRedirects="true"
?
退出链接为:http://localhost:8080/cas/logout?service=http://localhost:8080/Casclient/index.jsp
?
1.3、更改服务器端验证方式,采用数据库验证:
修改配置文件deployerConfigContext.xml,加dbcp连接池:(以oracle为例)
?
????
?????????
????
????
?????????
????
????
?????????
????
????
?????????
????
??
?
需要的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接口即可:
? ?
???
??
?
注释掉默认的验证方式,采用数据库查询验证:
?????
?????
????
?
?????
?????
?????
?????
?????
???
??
?
---------------到这里cas服务端的配置就完成了。
?
?
2、java客户端配置,下载客户端:http://downloads.jasig.org/cas-clients/,目前最新版本为:cas-client-3.2.0
?
将modules下的jar复制到java客户端Casclient1的lib下,在web.xml中配置过滤器,配置如下(详情见附件):
?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
?http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
?
?
?
?
????????
?
?
?
????????
????????
?
?
????????
????????
?
?
?
?
????????
????????
????????
????????????????
????????????????
????????????????
????????
????????
????????????????
????????????????
????????
?
?
????????
????????
?
?
?
?
????????
????????
???????????????? org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
????????
????????????????
????????????????
????????
????????
????????????????
????????????????
????????
?
?
????????
????????
?
?
?
?
????????
????????
???????????????? org.jasig.cas.client.util.HttpServletRequestWrapperFilter
?
?
????????
????????
?
???????
???????
???????
???????
?
?
?
???
?
?
页面为:
AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();???
String username = principal.getName();
%>
----------------------------------------------------------
登录成功,这是客户端1啊
用户名:
http://localhost:8989/Casclient2/index.jsp">进入客户端2
http://localhost:8080/cas/logout?service=http://localhost:8989/Casclient1/index.jsp">退出
?
-----------到这里java客户端配置成功,发布到tomcat,复制Casclient1改名为Casclient2,启动tomcat,
?
访问Casclient1,跳转到登录页面,登录成功后成功转向登录成功页面,这时访问Casclient2发现不需要登录即显示登录成功页面,java单点登录成功。
?
?
3、配置php客户端,下载php客户端:http://downloads.jasig.org/cas-clients/php/?,目前最新版本为:CAS-1.2.0RC2
?
新建php工程:Phpcasclient1,将CAS文件夹和CAS.php复制到工程中,修改CAS/client.php,将其中的https改为http,将docs/examples/example_simple.php
?
复制到工程中,修改如下:
//
// phpCAS simple client
//
// import phpCAS lib
include_once('CAS.php');
phpCAS::setDebug();
// initialize phpCAS
phpCAS::client(CAS_VERSION_2_0,'192.168.18.8',8080,'cas');
// no SSL validation for the CAS server
phpCAS::setNoCasServerValidation();
// force CAS authentication
phpCAS::forceAuthentication();
// at this step, the user has been authenticated by the CAS server
// and the user's login name can be read with phpCAS::getUser().
// logout if desired
if (isset($_REQUEST['logout'])) {
?
?$param=array("service"=>"http://localhost/Phpcasclient1/example_simple.php");//退出登录后返回
?phpCAS::logout($param);
}
// for this test, simply print that the authentication was successfull the user's login is . phpCAS version is .
?>
?
???
?
?
??? Successfull Authentication!这是客户端1
???
???
?????">去java客户端1
?????
?
?
php配置需要开启php_curl,可以复制Phpcasclient1为Phpcasclient2
?
访问:http://localhost/Phpcasclient1/example_simple.php,跳转到登录页面,登录成功后访问Phpcasclient2,不需要登录,
?
php单点登录成功,这时再访问java客户端发现也不需要登录,php和java应用之间单点登录成功。
?
注:php的phpCAS::client(CAS_VERSION_2_0,'192.168.18.8',8080,'cas');地址需要和java的web.xml中的cas服务器地址一致,我开始一个写的ip:192.168.18.8,一个写的localhost,
php和java总是不能同步登录,郁闷了好久
?
----------------到这里java和php的客户端已经配置完成,现在你会发现php和java之间不能单点登出,php端退出java客户端也退出,反之java退出但是php却没有同步退出
?
这里需要做一个配置,在
phpCAS::setNoCasServerValidation();
// force CAS authentication
phpCAS::forceAuthentication();
这里加上
?
phpCAS::setNoCasServerValidation();
// force CAS authentication
phpCAS::handleLogoutRequests();? 这里会检测服务器端java退出的通知,就能实现php和java间同步登出了。
phpCAS::forceAuthentication();
?
?
?
至于discuz+supesite的单点登录,再了解了php单点登录的原理后就需要改造discuz+supesite的登录代码了,discuz的为logging.php
?
supersite的为batch.login.php,俺是做java开发的,对php不是很熟悉,所以改造的觉得不是很靠谱,大致是先让discuz单点登录,获取用户名,根据用户
?
获取数据库中的密码再交给discuz系统自己的登录系统登录。discuz是采用cookie验证的,所以在java端退出后,discuz不会退出。
?
若谁有改造很成功的可以交流下。
?
参考网址:
http://blog.csdn.net/DL88250/archive/2008/08/20/2799522.aspx
http://www.wsria.com/archives/1349
http://tonrenyuye.blog.163.com/blog/static/30012576200922925820471/
http://www.discuz.net/thread-1416206-1-1.html
相关文章
相关视频
专题推荐
-
独孤九贱-php全栈开发教程
全栈 170W+
主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门
-
玉女心经-web前端开发教程
入门 80W+
主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门
-
天龙八部-实战开发教程
实战 120W+
主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习
上一篇: php+ajax实现无刷新动态加载数据技术_php实例
下一篇: 初学函数遇到一个小问题
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论