文档章节

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

rockman509
 rockman509
发布于 2017/02/28 18:12
字数 1681
阅读 33
收藏 0
点赞 0
评论 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
【翻译】Yii2 第1章 开始

让我们看看,怎样以最小的代价使用Yii2创建一个站点。目的是学习使用Yii2应用模版的安装过程,并开始体验模版里提供的一系列特性。 一个基本应用 开始使用Yii2最基本和直接的方式,是使用Yii...

zcgly
2015/09/15
844
7
composer yii2 mailer redis 包制作

1.github 创建项目 ,项目名称:yii2mailerqueue 2.制作并上传包 a.首先clone yii2_mailerqueue 项目 b.打开yii2mailerqueue文件,把开发测试完成的源码文件夹 src 复制黏贴到yii2mailerqueue根...

罗培海
2017/10/25
0
0
yii中登录时setState失效

今天在用户登录后,想通过Yii::app()->user->setState("extData", $extData);记录一些跟用户相关的额外数据时发现死活记不进去,即,刷新页面后,用Yii::app()->user->setState("extData")取...

bobshi
2013/01/21
0
4
yii2项目实战-用户管理之user组件的配置

作者:白狼 出处:http://www.manks.top/document/yii2-user-config.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律...

白狼栈
2016/08/22
20
0
yii2项目实战-博客管理平台的搭建

作者:白狼 出处:http://www.manks.top/document/yii2-blog-manage.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律...

白狼栈
2016/08/13
56
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python以太坊类库web3.py概览

python通过web3.py库与以太坊交互共同入口是web3对象。web3对象提供API接口,python开发应用与以太坊进行交互如钱包创建、支付、转账等连接JSON-RPC服务器进行。 Providers提供者 Providers使...

智能合约
4分钟前
0
0
【Android学习笔记】设置App启动页

先将启动页放到项目资源中,图片一般是1080*1920的jpg。 新建一个activity,如图: 创建成功之后,打开刚刚创建的activity,来进行代码的编写: >>>阅读全文

全部原谅
5分钟前
0
0
什么是React-redux、为什么使用React-redux、怎么使用React-redux

1、什么是React-redux React-redux是用于连接React和Redux的 2、为什么使用React-redux 使用React-redux可以使redux部分代码更简洁更明了,比如组建中需要使用到的数据都在mapStateToProps方...

kimyeongnam
8分钟前
0
0
Spring核心——Stereotype组件与Bean扫描

在注解自动装载中介绍了通过注解(Annotation)自动向Bean中注入其他Bean的方法,本篇将介绍通过注解(Annotation)向容器添加Bean的方法。 Spring的核心容器提供了@Component和@Bean注解来标...

随风溜达的向日葵
8分钟前
0
0
利用世界杯,读懂 Python 装饰器

Python 装饰器是在面试过程高频被问到的问题,装饰器也是一个非常好用的特性, 熟练掌握装饰器会让你的编程思路更加宽广,程序也更加 pythonic。 今天就结合最近的世界杯带大家理解下装饰器。...

猫咪编程
12分钟前
0
0
flink fold example

flink fold例子 import org.apache.flink.api.common.functions.*;import org.apache.flink.streaming.api.datastream.DataStream;import org.apache.flink.streaming.api.environment.S......

coord
13分钟前
0
0
c++ qt 组播总结

每个人都有不同的认知规律和习惯, 有的人喜欢搞一套严密的大理论, 论述起来滔滔不绝, 不管自己懂不懂, 反正读者/听者是没搞懂。 有的人喜欢从实践出发, 没看到代码, 不运行一下, 不看...

backtrackx
17分钟前
0
0
Sublime text2安装json格式化插件SublimePrettyJson[Windows]

一、下载SublimePrettyJson插件包 https://github.com/dzhibas/SublimePrettyJson 二、将下载的文件解压放到在package目录下面 C:\Users\lucky\AppData\Roaming\Sublime Text 3\Packages 每个......

lazy~
17分钟前
0
0
安装vue-cli 报4058错误

1. 4058是网络代理错误。 安装淘宝源修改一下就可以了: npm --registry https://registry.npm.taobao.org info underscore 改为cnpm执行: cnpm install --global vue-cli 安装成功: 试试版...

MrBoyce
18分钟前
0
0
CPU飙升分析

1、top -----看具体的进程 2、top -H -p pid ------该进程的线程 3、printf 0x%x 15248 ------将线程改为16进制 4、jstack 进程...

北极之北
21分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部