靠着双手,终于将cas与discuz 中的ucenter整合完毕。但是,是盲人摸象摸过来的。中间遇到过很多的困难,但是,终究是完成了。
这里不得不对“拍黄片”进行一定的吐槽。相对java来说,语法什么的还是比较难用的,就比如,$username = mb_split("@", $user)[0];这种写法再java很好不是么。但是在php中却必须分成两句$usernamearr = mb_split("@", $user);$username = $usernamearr[0];否则,直接在require 这个文件的时候,就挂掉了。。也没有错误抛出。坑爹啊…… 但是,也不得不说,php不需要编译,再加上phpstorm可以直接将文件发送到对应的服务器上。在调试的时候,酸爽的一塌糊涂。
好,吐槽完毕,言归正传。首先,discuz的搭建,可以去找度娘。用一个同事的话说:“那娘们儿啥都会。。。。” 。。。。。
首先,我们需要下载 phpCAS 地址是在 http://developer.jasig.org/cas-clients/php/ 我们这次整合的时候采用的是1.3.0版本
- 需要将内容嵌入到discuz的项目中 。我们直接解压缩 Cas到discuz项目根目录。
- 修改discuz的类加载器修改./source/class/class_core.php
引入Cas的Autoload.php 文件
在调用类加载器的时候,会尝试先调用cas的类加载器
- 导出证书文件到pem文件
因为java项目都是到处的crt 或者cer证书,所以,我们直接把这个证书给导出成pem格式即可
openssl x509 -inform der -in server.cer -out server.pem - 修改ucenter登录代码
因为我们是不能也不愿意返回用户的密码的,于是,出于简单的目的,我们对ucenter做了邪恶的阉割。
./uc_server/model/user.php 中的 add_user方法中增加了一句$password = md5(md5('123123@#@$!)(@(').$salt);
这样,所有的用户的密码均相同了.也就是说,虽然discuz有着用户名和密码的校验功能,但是,其实已经名存实亡.好处是,我们可以轻松跟uc同步登陆,创口小,不复发,安全系数高........
- 增加CasClient.php代码
<?php error_log("123"); include_once (DISCUZ_ROOT. 'Cas/CAS.php'); loaducenter(); phpCAS::setDebug (); phpCAS::client ( CAS_VERSION_2_0, "cas.ccod.cn", 8443, "/cas" ); phpCAS::setCasServerCACert($cas_server_ca_cert_path='/home/www/bbs/Cas/server.pem'); phpCAS::handleLogoutRequests(); if(!phpCas::checkAuthentication()){ phpCAS::forceAuthentication(); } else { $user = phpCAS::getUser(); $mb_split = mb_split("@", $user); $my_username = addslashes($mb_split[0]); if(uc_user_logincheck($my_username, $_G['clientip']) == 5){ error_log('准备初始化discuz'); $discuz = C::app(); error_log('初始化discuz完毕'); $discuz->init(); require libfile('function/member'); require libfile('class/member'); $_GET['formhash'] = $_G['formhash']; $_GET['from'] = 1; $_GET['loginsubmit'] = $_GET['infloat'] = 'yes'; $_GET['cookietime'] = '2592000'; $_GET['username'] = 'BEITAI'; $_GET['password'] = '123123@#@$!)(@(';
$_GET['auth'] = ''; error_log('初始化参数完毕'); $ctl_obj = new logging_ctl(); $ctl_obj->setting = $_G['setting']; $method = 'on_login'; $ctl_obj->template = 'member/login'; $ctl_obj->$method(); echo "成功登录!".time(); } }
?>
- 将登陆代码嵌入到discuz中
修改.source/include/post/post_newthread.php代码,此处乃是postperm_login_nopermission 没有权限的话会跳转到登陆界面。我们再这里加入cas权限校验,如果cas登陆成功则同步登陆ucenter
- 将登出代码嵌入到discuz中
修改.source/class/class_member.php 修改 on_logout()方法
在这个方法中插入这段代码:表示会登出cas,并跳转到http://discuz/bbs/index.php 这个地址上
include_once (DISCUZ_ROOT. 'Cas/CAS.php'); phpCAS::client ( CAS_VERSION_2_0, "cas.ccod.cn", 8443, "/cas" ); $param=array("service"=>"http://discuz/bbs/index.php"); phpCAS::logout($param);
- 将拦截登出请求嵌入到discuz中
这个暂时没有做,不过不外乎是 再class_core或者function_core中增加一个,以确保登出请求呗拦截和处理.仅此而已,有兴趣的童鞋可以试试
phpCAS::client ( CAS_VERSION_2_0, "cas.ccod.cn", 8443, "/cas" ); phpCAS::setCasServerCACert($cas_server_ca_cert_path='/home/www/bbs/Cas/server.pem'); phpCAS::handleLogoutRequests();
欢迎各位童鞋参观指导,并给出相应意见和建议