Discuz粉丝网(www.discuzfans.net)

 找回密码
 立即注册

扫一扫,微信登录

搜索
热搜: 活动 交友 discuz

[开发教程] yii与discuz ucenter实现同步登陆

[复制链接]
 新手上路 lrcar0 发表于 2016-2-22 14:24:49 |阅读模式
上面我们说过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.     }
复制代码



输入图片说明
回复

使用道具 举报

 中级会员 suoujc 发表于 2018-1-2 10:52:15

RE: yii与discuz ucenter实现同步登陆

感谢分享,支持支持。
回复

使用道具 举报

 新手上路 ssbaoer89 发表于 2019-7-31 11:01:25
"当然,道理也很简单。你购买的那张彩票正好中奖的概率确实太小了。但是,买彩票的又不是只有你一个人。实际情况是,每周都有很多人买彩票,通常,他们每人还不只买一张。所以,整体来讲,人们买了很
必然性定律(law of inevitability)是指某种结果一定会出现——当彩票球摇选结束时,结果肯定是14000000组(1到49之间的任意6个数字组合)数字中的一组。所以  北京pk10   如果你买下了所有的可能组合,头奖肯定是你的。这听起来像是在说废话——谁能把所有号码都买下来呢?买下来也不挣钱啊,发售彩票的公司也不是傻子。不过,人们还是能找到从中赚钱的方法(下面会介绍)。
选择性定律(law of selection)告诉我们,事前预测可能很困难,而事后诸葛亮则简单得多。当我们回顾事件始终时,很容易能看出平常小事是如何不可避免地演变成一场灾难,但事前,在众多的可能环节中,做出选择并不那么容易。
足够接近定律(law of near enough)告诉我们,如果你将巧合的定义拓宽一些,巧合的概率就会显著增加。举个例子:也许,如果你在一个陌生的小镇偶遇一位老友,你当然会感到十分惊讶,但你遇到朋友的朋友的时候可能也会有些惊讶,而“朋友的朋友”实际上比朋友要多得多。
最后是可能性杠杆定律(the law of the probability lever),它告诉我们,只要轻微的改变就可以使得极不可能的事情变成几乎确定会发生。这就能解释为什么我们总是遇到金融危机,“特异功能”实验总是能成功,有人会反复被闪电袭击,等等这样的现象。
我们就以泰坦尼克号为例。英国白星航运公司制造的这艘邮轮被称为“永不沉没”的轮船,它有双底层结构的船体    重庆时时彩  以确保海水淹入其中的概率非常小。再者,邮轮一共有16个船舱,每一间的舱壁都带有可遥控的防水门。要使邮轮下沉,通常需要有大量海水同时涌入其中几个船舱,但对于泰坦尼克号来说,如果某一船舱被海水淹没的可能性非常小,那么几个船舱同时被海水灌满的可能性就更是极小。
考虑到这些因素,很多人认为,泰坦尼克号是不可能沉没的。表面看来,推理的基本思路看似无懈可击:如果说买彩票中大奖的概率是微乎其微,你连续买彩票中大奖的概率就更是小得可怜。如果你买了一张英国国家彩票,你中奖的概率就约是1400万分之一   幸运飞艇    如果你连续两周都买了彩票,那么你两次都中奖的概率就是2×1014分之一,或者大概等同于投掷硬币连续48次都出现正面朝上的概率。换句话讲,希望渺茫。"
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 扫一扫,微信登录

本版积分规则

小黑屋|手机版|Discuz粉丝网 ( 浙ICP备10214163号 )star

GMT+8, 2019-10-14 04:14 , Processed in 0.061749 second(s), 13 queries .

Powered by Discuz! Lite

© 2001-2019 Comsenz Inc.

快速回复 返回顶部 返回列表