当前位置:首页 > CMS教程 > Discuz > 列表

yii与discuz ucenter实现同步登陆

发布:smiling 来源: PHP粉丝网  添加日期:2015-09-30 11:22:05 浏览: 评论:0 

上面我们说过yii与discuz实现的通信,这里我们去研究下如何实现同步登陆,注册,退出

说明:yii于discuz同步的前提有以下几点:

当前主网站也discuz必须是新网站.

原因:根据ucenter提供的同步登陆方法uc_user_synlogin这里仅支持用户的id,我们查看 表:前缀_members时,发现该表中只有用户id即uid为主键的,ucenter不提供用户名同步登陆方法,所以主网站和discuz必须是新的,如果不是新的,比如:主网站已经有部分用户了,而论坛是后期上的,就会出现一系列问题,比如主网站登陆的时候需要先检测论坛是否存在这个用户,如果不存在这个用户还需要先添加到论坛中,但是添加的时候,是需要uid,这里为了保证一致性,我设定的主网站id即为表前缀_members表中的uid,否则检测不到数据,如果是先有论坛后有网站等也会出现一系列问题,这里就不做说明.

下面的代码实例均是网站是新网站,discuz 论坛也是新的即,数据库都是清空状态.

登陆(yii系统自带登陆方法):

1、找到,目录:protected/controller/SiteController.php

找到actionLogin这个方法,具体代码如下,覆盖即可:

  1. public function actionLogin() 
  2.     { 
  3.         $model = new LoginForm; 
  4.         if(isset($_POST['ajax']) && $_POST['ajax']==='login-form'
  5.         { 
  6.             echo CActiveForm::validate($model); 
  7.             Yii::app()->end(); 
  8.         } 
  9.         if(isset($_POST['LoginForm'])) 
  10.         { 
  11.             $model->attributes=$_POST['LoginForm']; 
  12.             if($model->validate() && $model->login()){ 
  13.                 Yii::import('application.vendor.ucenter.*');//引入文件夹 
  14.                 include_once 'ucenter.php'//引入文件 
  15.                 $script = uc_user_synlogin(Yii::app()->user->id);  //调用ucenter的通信代码,大家可以去追踪下代码,最后追踪到的代码uc_server/control/user.php这里么,在这个函数中onsynlogin。我们可以看到最终返回的是引入的js文件,但是这里如果你打印或者输出来$script是不显示的,因为浏览器已经给转义了,你可以查看源码,即可看到js引入。 
  16.                 echo "$script";//这里的echo是执行$script,如果你不写执行则不会触发这个$script;有好多地方这里写的是$this->redirect("要跳转的路径");。但是我这样写的时候出现了问题,因为,上面的echo $script毕竟是js代码,执行没有$this->redirect的速度快,所以优先执行了这个,导致不能同步登陆。所以这里改成下面这种写法,毕竟都是js,所以优先执行了上面的js引入。 
  17.                 echo '《script type="text/javascript">window.location.href="'.Yii::app()->user->returnUrl.'";《/script>'
  18.                 Yii::app()->end();//终止程序,类似于exit 或者dir(); 
  19.             } //phpfensi.com 
  20.         } 
  21.         $this->render('login',array('model'=>$model)); 
  22.     } 

登陆(自定义登陆方法且是ajax情况,这个情况比较复杂),其他代码都一样,这里仅贴出主要代码.

  1. //这里省略了ajax传入这个页面判定用户信息是否是我们需要的用户信息,且当前主网站有这个用户 
  2.               Yii::import('application.vendor.*'); 
  3.                include_once 'ucenter.php'
  4.                $script = uc_user_synlogin($oneUser->id);  //这里已经拿到js代码了,但是没法执行里面的代码,不能像上面呢样直接输出,直接输出我这里不能执行。 
  5.                $matches = ''
  6.                $pattern =''
  7.                preg_match($pattern,$script,$matches); 
  8.                $url = $matches[1];//这里将src中的地址拿出来 
  9.                header("location:$url");//用header跳转执行,我使用curl的时候也不能执行,暂时不知道是啥原因 
  10.                echo 1;//这里好像还必须输出任意东西,不然还会出现一系列问题。但是理论上,上面的header已经跳走了,下面的echo 1应该是不执行的。确实是不执行的但是还必须有,这里就先不纠结了。 

退出:

1、退出没有实际的什么难点,主要还是和上面以上php比js优先执行的问题,注意这点就可以了,下面是实际代码:

  1. public function actionLogout() 
  2.     { 
  3.         Yii::app()->user->logout(); 
  4.         Yii::import('application.vendor.*'); 
  5.         include_once 'ucenter.php'
  6.         $script = uc_user_synlogout(); 
  7.         echo $script
  8.  
  9.         Yii::app()->end(); 
  10.     }

Tags: yii同步登陆 discuz同步登陆

分享到: