discuz3x ucenter 与cas 初步整合

          靠着双手,终于将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版本

  1. 需要将内容嵌入到discuz的项目中 。我们直接解压缩 Cas到discuz项目根目录。
  2. 修改discuz的类加载器修改./source/class/class_core.php

    1. 引入Cas的Autoload.php 文件

    2.  在调用类加载器的时候,会尝试先调用cas的类加载器
  3. 导出证书文件到pem文件
    因为java项目都是到处的crt 或者cer证书,所以,我们直接把这个证书给导出成pem格式即可
    openssl x509 -inform der -in server.cer -out server.pem
  4. 修改ucenter登录代码
    因为我们是不能也不愿意返回用户的密码的,于是,出于简单的目的,我们对ucenter做了邪恶的阉割。
    ./uc_server/model/user.php  中的 add_user方法中增加了一句
    $password = md5(md5('123123@#@$!)(@(').$salt)
    这样,所有的用户的密码均相同了.也就是说,虽然discuz有着用户名和密码的校验功能,但是,其实已经名存实亡.好处是,我们可以轻松跟uc同步登陆,创口小,不复发,安全系数高........
  5. 增加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();
     }
    }
    ?>
  6. 将登陆代码嵌入到discuz中
    修改.source/include/post/post_newthread.php代码,此处乃是 
     
    postperm_login_nopermission 没有权限的话会跳转到登陆界面。我们再这里加入cas权限校验,如果cas登陆成功则同步登陆ucenter

  7. 将登出代码嵌入到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);

     

  8. 将拦截登出请求嵌入到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();

         

欢迎各位童鞋参观指导,并给出相应意见和建议 

阅读更多
个人分类: 開發相關
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭