文档章节

PHPChina中的Yii2与Discuz会员打通(单点登录)

rockman509
 rockman509
发布于 2017/02/28 18:12
字数 1681
阅读 41
收藏 0

背景介绍

PHPChina论坛是国内早一批的技术型论坛,在Discuz的基础上开发。Discuz作为国内选用最多的论坛CMS系统,的确在搭建论坛站上有许多优势:功能全、搭建快速、模板丰富。PHPChina在今年3月份改版的时候仍旧是在Discuz的框架中进行二次开发,新增了主页和招聘的模块。但是在开发中就感觉到了,在dz上开发的许多不便捷的地方。Discuz毕竟是一个面向过程的框架,不符合现在面向对象的编程思想。还有就是DZ中开发其他非论坛的业务也是很不爽。所以在二期开发的过程中,PHPChina团队选择了另外的框架-Yii2进行开发。

在新的框架上开发并没有什么难点,两个框架并存,最多做一个会员的打通就可以搞定。

由于PHPChina上的会员已经达到了40W+的量,并且当初开发的招聘模块都是基于DZ会员的系统开发的,所以在Yii上开发我们别无选择,只能将DZ中的会员信息对接过来。所以基本的思路就是做一个单点登录,无论是在Yii中还是DZ中都能做到同步登录、退出。

以下介绍都基于本地环境介绍。

新建应用并配置通信

首先说明一下我们应用的目录结构:在本地的开发环境中有两个基础文件夹,一个为trunk_dz一个为trunk_yii。这两个文件夹对应了两个不同的框架。

然后你需要去discuz的官网上下载一个Ucenter的安装包,链接地址:http://www.comsenz.com/downloads/install/ucenter,下载适合你版本和编码的Ucenter。然后将解压后的advanced文件夹中的uc_client和example下的api、include、config.inc.php这几个文件和文件夹复制到你的新应用的跟目录下,在本例中我应该复制到trunk_yii下。

进入DZ的管理后台,进入Ucenter中心点击左侧的应用管理,点击添加新应用。

选择自定义安装方式,应用类型为DiscuzX,应用名称随意填(如PPCyii),应用的URL:http://localhost/phpchina_pro/trunk_yii,应用IP:127.0.0.1,最后的开启同步登录和接受通知选择是,然后点击提交。提交完成后,在应用管理页面可以看到你刚刚添加的应用,点击该应用。将该应用的通信秘钥复制出来,添加到yii目录下的config.inc.php中的UC_KEY中,并将此文件中的参数配置完整。然后回到你的应用列表中,右侧显示通信成功则表示配置正确。

通信成功后我们已经做好了第一步准备工作。

为你的Yii应用添加参数配置

至此我们还需要面临一个问题,两个框架并存,路由是不通的。从DZ页面进来的用户是不能路由到YII的应用中的。我们解决这个问题的方法就是配置参数,将两个框架互相要用到的URL地址配置成全路径的参数形式,比如DZ要跳转到Yii中的导航页面,需要在DZ后台的导航设置中的URL中填写http://localhost/phpchina_pro/trunk_tii/index.php这样才能实现两个框架不同路由的跳转。

你可以在你的Yii应用中需要跳转到DZ的URL的地方都以配置参数的形式配置URL,比如在Yii的登录链接中你可以配置为http://localhost/phpchina_pro/trunk_dz/member.php?mod=logging&action=login,这样在你的Yii应用中点击登录就会跳转到DZ的登录应用。这样只需要做一个单点登录,将DZ登录的信息同步到Yii中即可。

实现同步登录、退出

本来做同步登录、退出之前的想法是将DZ的会员SESSION信息储存到Redis上,这样只需将php配置中Session的存储方式由文件改成Redis就可以轻松实现。但是仔细研究才发现,DZ里根本没有Session哭。PlanA计划失败。

然后就想到了用DZ的Ucenter做同步登录。后来发现其实也只能用这种方法,因为同步退出必须依赖Ucenter。

Ucenter同步登录的原理就是DZ解析cookie信息。好在我们的应用都在同一个域名下,cookie是同步的,只需要将cookie解密出来即可获得用户的登录信息。

首先你需要在Yii中引入刚才复制到Yii根目录的config.inc.php和uc_client/client.php文件。

直接上代码了

if(!empty($_COOKIE[$cookie_auth]) )  
        {  
            $key = Yii::$app->params['uc_key'];  
            list($user_psw, $user_uid) = explode("\t", uc_authcode($_COOKIE[$cookie_auth], 'DECODE',$key));  
} 

上面的$cookie_auth为我配置的cookie参数,其实为DZ cookie中的pre_cookie,你可以打开调试台看到你的cookie参数,前面有一个前缀将你的这个pre_auth换成上面的$cookie_auth即可。

还有一个$key参数。这个参数其实是你在第一步添加新应用的UC_KEY参数,用来解密cookie的。但是坑爹的是一开我怎么解密都不成功。后来在网上查资料和阅读登录加密的源码才发现这是个坑爹的地方。

原来在DZ登录加密的时候使用的不是UC_KEY加密的,而是用一个authkey加密的。加密和解密的参数不一样肯定是解密不出来的啊!所以现在只能去改源码了。找到DZ目录下的source\function\function_core.php文件,搜索authcode函数。这个函数中有一个$key参数,默认为空。现在我让他不为空,随便写点什么,比如‘PHPChina’。然后在上面的代码中将$key赋值为‘PHPChina’。这样在DZ未登录的情况下是没有pre_auth这个cookie的,登录后我们解析这个cookie就可获得登录用户的密码和uid了。然后我有了uid再去数据库里查询用户的信息即可。至此登录就完成了。

下面说一下退出。

退出也要用到UC的函数来处理。

public function actionLogOut(){  
        $script = uc_user_synlogout($_SESSION['uid']);  
        echo $script;  
        $msg_data = msg_data('退出成功',Yii::$app->request->getReferrer());  
        return $this->render('@common_web/msg',['msg_data'=>$msg_data]);  
} 

 

只需要在你的Yii应用退出上路由到这个方法,就会实现同步退出。记得一定要将$script输出,这个变量存储了一段JS代码,是用来消除cookie的。然后做一个提示用户退出成功的提示消息就可以了。

© 著作权归作者所有

共有 人打赏支持
rockman509

rockman509

粉丝 6
博文 20
码字总数 25462
作品 0
静安
程序员
Yii框架应用程序整合Ucenter实现同步注册、登录和退出等

如今很多网站都要整合论坛程序,而康盛的Discuz系列产品往往是首选。然后就有了整合用户的需要,康盛提供了Ucenter架构,方便对不同的应用程序进行单点登录整合。 进来我尝试将ucenter整合到...

王达名字被人抢了我艹
2013/07/25
0
0
Yii 2.0开发一个仿京东商城平台

第1章 课程简介 介绍了课程内容、背景和案例展示。 第2章 项目的准备工作 介绍了如何使用PHP依赖管理工具Composer安装Yii2框架,模拟配置真实企业开发项目运行环境和编辑器。 第3章 项目前台...

15543595340
05/19
0
0
yii2开发中19条推荐实践(阿北总结)

虽然每个人的编程风格不同,但是有些建议能让你的代码更加规范和稳定,本次就我这次网站更新总结如下几点,希望对你的yii2学习和使用有所帮助。 环境说明 服务器环境: CentOS 开发环境及IDE...

阿北2017
06/02
0
0
Yii入门指导(四):强大的“小物件”

1,修改默认的控制器 Yii的默认应用: 所有的配置都可以在main.php中进行配置,那么修改默认的控制器就是在main.php中增加如下代码: 'defaultController' => '', //修改默认控制器 Yii模块:...

Koma
2014/10/24
0
1
yii2 restful 风格搭建(二)接口认证

做完了基本的 restful 搭建,就需要接口认证和定义返回码了 一、yii2 支持的 3种认证方式 1、HTTP 基本认证: yiifiltersauthHttpBasicAuth 支持两种认证方式,输入用户名和密码和只输入用户名...

botkenni
05/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Maven 项目中依赖的搜索顺序

ettings_mirror 的优先级高于 central settings_profile_repo 优先级高于 settings_mirror settings_profile_repo 优先级高于 pom_repositories settings_profile_repo 优先级高于 pom_prof......

xingyu4j
14分钟前
1
0
改变maven项目的名称

pom.xml <groupId>com.soft.xxx</groupId><artifactId>xxx</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>xxx Maven Webapp</name><build>......

1713716445
16分钟前
2
0
windows下按照RabbitMQ

rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平...

zhaochaochao
16分钟前
2
0
10个PHP比特币开源项目

如果你是一个Phper,如果你希望学习区块链,那么本文列出的10个开源的Php比特币项目,将有助于你了解在自己的应用中如何加入对比特币的支持。 如果你希望快速掌握使用Php对接比特币钱包的方法...

笔阁
23分钟前
14
0
MyBatis级联探讨

数据模型 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper name......

职业搬砖20年
27分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部