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这个方法,具体代码如下,覆盖即可:
- public function actionLogin()
- {
- $model = new LoginForm;
- if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
- {
- echo CActiveForm::validate($model);
- Yii::app()->end();
- }
- if(isset($_POST['LoginForm']))
- {
- $model->attributes=$_POST['LoginForm'];
- if($model->validate() && $model->login()){
- Yii::import('application.vendor.ucenter.*');//引入文件夹
- include_once 'ucenter.php'; //引入文件
- $script = uc_user_synlogin(Yii::app()->user->id); //调用ucenter的通信代码,大家可以去追踪下代码,最后追踪到的代码uc_server/control/user.php这里么,在这个函数中onsynlogin。我们可以看到最终返回的是引入的js文件,但是这里如果你打印或者输出来$script是不显示的,因为浏览器已经给转义了,你可以查看源码,即可看到js引入。
- echo "$script";//这里的echo是执行$script,如果你不写执行则不会触发这个$script;有好多地方这里写的是$this->redirect("要跳转的路径");。但是我这样写的时候出现了问题,因为,上面的echo $script毕竟是js代码,执行没有$this->redirect的速度快,所以优先执行了这个,导致不能同步登陆。所以这里改成下面这种写法,毕竟都是js,所以优先执行了上面的js引入。
- echo '《script type="text/javascript">window.location.href="'.Yii::app()->user->returnUrl.'";《/script>';
- Yii::app()->end();//终止程序,类似于exit 或者dir();
- } //phpfensi.com
- }
- $this->render('login',array('model'=>$model));
- }
登陆(自定义登陆方法且是ajax情况,这个情况比较复杂),其他代码都一样,这里仅贴出主要代码.
- //这里省略了ajax传入这个页面判定用户信息是否是我们需要的用户信息,且当前主网站有这个用户
- Yii::import('application.vendor.*');
- include_once 'ucenter.php';
- $script = uc_user_synlogin($oneUser->id); //这里已经拿到js代码了,但是没法执行里面的代码,不能像上面呢样直接输出,直接输出我这里不能执行。
- $matches = '';
- $pattern ='';
- preg_match($pattern,$script,$matches);
- $url = $matches[1];//这里将src中的地址拿出来
- header("location:$url");//用header跳转执行,我使用curl的时候也不能执行,暂时不知道是啥原因
- echo 1;//这里好像还必须输出任意东西,不然还会出现一系列问题。但是理论上,上面的header已经跳走了,下面的echo 1应该是不执行的。确实是不执行的但是还必须有,这里就先不纠结了。
退出:
1、退出没有实际的什么难点,主要还是和上面以上php比js优先执行的问题,注意这点就可以了,下面是实际代码:
- public function actionLogout()
- {
- Yii::app()->user->logout();
- Yii::import('application.vendor.*');
- include_once 'ucenter.php';
- $script = uc_user_synlogout();
- echo $script;
- Yii::app()->end();
- }
Tags: yii同步登陆 discuz同步登陆
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)