背景介绍

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的。然后做一个提示用户退出成功的提示消息就可以了。

转载于:https://my.oschina.net/u/2898364/blog/847973

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

  1. java和Discuz论坛实现单点登录,通过Ucenter(用户管理中心)

    果学网-专注IT在线www.prismcollege.com 1,按照下面各大链接的教程,把Base64,Client,PHPFunctions,UC,XMLHelper加入web程序. 2,修改we ...

  2. Thinkphp5 php会员实现单点登录

    最近在赶一个项目时用到了单点登录功能,一开始在百度和官网中搜了搜,得到的结果不是不我想要的,毕竟是一个小东西搞的太复杂了.所以自己想出了一个简单实现功能 要求是会员在不同的登录端登录时,退出其它已登录 ...

  3. Java单点登录在校园身份管理系统中的实现

    java单点登录在校园身份管理系统中的实现 摘要: 一个学校或企业的内部有很多信息系统,用户登录这些系统时需要进行身份认证.传统的认证机制是基于用户名和密码的,每一个系统都建立有自己的用户信息数据库, ...

  4. 微信小程序与公众号卡券/会员打通

    微信小程序与公众号卡券/会员打通 卡券开发:带你走出小程序的坑 tips:由于笔者也是一位前端菜鸟,所以尽量用简单直白的语言为大家讲解,如有说的不到位的地方,还望多多指教 - 作为小程序的研发人员已经 ...

  5. 如何去除Discuz标题栏中的Powered by Discuz!

    今天修改discuz代码遇到一个问题,就是标题栏中的Powered by Discuz!,很不美观.查资料后得到了解决方法!介绍给大家. 那么如何去掉标题里面的Powered by Discuz!呢? ...

  6. Asp.Net站点整合Discuz论坛实现同步注册和单点登录

    最近在一个小站中整合了Discuz论坛,查阅了些资料后实现了同步注册和单点登录. Discuz是以虚拟目录的方式加载网站中,整合Discuz到网站中进行安装要注意一下几个问题: Discuz所在的目录 ...

  7. discuz admin.php无法登录,忘记管理员密码无法登录Discuz后台管理员的解决方法汇总...

    Discuz管理员无法登陆后台的情况有多种下面会对这些问题提供一些解决方法:也会有可以登陆前台却无法登陆后台的一系列解决办法,下面是无忧主机小编总结的其中方法,希望对大家有所帮助. 1.管理员用户组变 ...

  8. php管理员登陆问题,discuz论坛管理员无法登录后台的原因和解决方法

    很久没有登录discuz论坛的后台了,前两天晓兔发现登录后台输入正确的密码和验证问答,页面直接刷新没有跳转,重复了好几次都无法登录.在CSDN上找到了原因和解决方法,在这里分享给大家: 晓兔遇到的应该 ...

  9. php固定登录账号,PHP实现会员单一账号登录

    本文实例讲述了PHP实现会员账号单唯一登录的方法.分享给大家供大家参考,具体如下: 情景再现 同一会员账号限制在同一台设备(电脑.手机.Ipad等)上单点登录,重复登录后,原登录访问页面时则直接跳转到 ...

最新文章

  1. 年赚百万烤肉店老板嘲讽程序员:你们拼死拼活也挣不到100万
  2. non-member function cannot have cv-qualifier
  3. [新手-数据分析师]numpy学习笔记(2nd)
  4. ORACLE-删除同一字段中重复值函数
  5. LeetCode——Find the Difference
  6. Python module模块 包 __name__
  7. jzoj1610(初中)-导弹【最大匹配,最短路,二分答案】
  8. 07 ansible 角色roles 整合多个剧本
  9. 通过实例看懂diff命令输出
  10. mysql配置多个磁盘_MySQL多实例配置(两)
  11. 重新打包版Inno Setup 5.4.3
  12. Oracle如何使用PL/SQL调试存储过程
  13. 基于XML操作辅助类
  14. html2canvas ios 15.0截屏 变黑 页面刷新
  15. 分享到微信微博QQ空间JS代码大全
  16. nginx出现403错误的解决方法(亲测有效)
  17. 手写HashMap,快手面试官直呼内行
  18. 白帽子守护网络安全,高薪酬成大学生就业首选!
  19. L1-012 计算指数 (5 分) C语言
  20. 语义分析的一些方法(三)

热门文章

  1. 精确匹配字符串的小技巧
  2. 字符串<string.h>头文件
  3. 基于ANSYS Workbench的表面裂纹计算
  4. 99美元的Mira Prism,将iPhone变成一个迷你“HoloLens”
  5. android 程序的后缀,Android Studio项目文件的扩展名是什么?
  6. 云队友丨别跟精英型组织的员工谈管理
  7. PSP2000 USB视频输出到电脑!图文教程!
  8. 栅极驱动器中的电荷泵---BLDC和H桥预驱IC中的电荷泵
  9. 在Linux下,SVN服务器的安装
  10. 学习Muduo中ChatRoom实现的各种细节和思考