thinkphp3.2.3,discuz 同步登录实现方案
ucenter同步登录原理
为了顺利解决部署过程中可能出现的问题,推荐笔友们先阅读一下这篇文章《简单分析ucenter 会员同步登录通信原理》,明白部署中各个步骤的作用。
部署过程记录
1. 下载附件
api.zip,
ThinkphpUcenter.zip,分别解压后,将源码与ThinkPHP框架部署如下:
按照上图部署完项目目录后进入下一步,关于config.inc.php文件在此先不用关心,在安装完成discuz并在ucenter中添加了应用之后便可得到此文件中的代码。
2,进入Ucenter点击应用管理添加应用。应用配置如下图
填写完成后提交,会在提交按钮下方出现配置代码:
3,将些部分代码复制到config.inc.php文件中保存,至此在Ucenter应用管理列表中的该应用通讯状态应为通讯成功。
4,回到项目目录,在ThinkPHP应用的配置文件config.php中添加数组元素“'AUTH_KEY' => 'xxxxx”;值在Discuz配置文件目录config下的config_global.php文件中的$_config['security']['authkey']的值。
5. 修改Ucenter与ThinkPHP冲突的类名
(1)/uc_client/model/base.php 将类名改为uc_base (只需更改类名不需更改文件名)
(2)将/uc_client/control/下的所有继承base类的文件改为继承uc_base
(3)检查/uc_client/lib/db.class.php 类名是否为 ucclient_db,若为db则需更改为ucclient_db
6. 配置双向登录
在需要验证用户登录的地方添加以下代码,这里以BaseController.class.php 文件为例,所有Controller都继承自BaseController,BaseController.class.php代码如下
其中$_COOKIE['8asp_2132_auth']中的8asp可通过dump($_COOKIE);来获取将此代码段中的四处$_COOKIE['XXXX_2132_XXXX']替换为dump出的前缀。
完成后在项目登录方法中登录验证成功后添加如下代码:
这里有个地方需要注意:在登录成功后跳转至其他页面时,因为需要留有时间执行同步登录返回的javascript代码,所以不能直接在登录后直接使用thinkphp自带的redirect或succes执行跳转,否则同步登录将不会执行。正确的方法是新建一个跳转页面,用来存放返回的javascript代码,即$login['synlogin'],然后,传递跳转页url,通过javascript实现跳转,代码大致如下:
用户登录方法:
public function login() { if (IS_POST) { //同步登录论坛 vendor('ThinkphpUcenter.UcApi'); $login = UcApi::login($localusername, $localpassword); if (!$login) { $this->error('同步登录失败'); } $referurl = isset($_POST['referurl']) ? $_POST['referurl'] : $_SERVER['HTTP_REFERER']; $jumpUrl = $this->redirectReferurl($referurl); $this->assign('message', '登录成功'); $this->assign('synhtml', $login['synlogin']); $this->assign('jumpUrl', $jumpUrl); $this->assign('waitSecond', 3); $this->display('jump'); } }
跳转页模板文件:
<include file="Public:header" title="跳转提示" keywords="" description=""/> {$synhtml} <div style="float: left;font-size: 16px;text-align:left;width: 790px;padding:100px;"> <b>(:</b> {$message}<br/> <br/><a id="href" href="<?php echo($jumpUrl); ?>">如果你的浏览器没有自动跳转,请点击这里...</a> <br /> 等待时间: <b id="wait"><?php echo($waitSecond); ?></b> </div> <script type="text/javascript"> (function() { var wait = document.getElementById('wait'), href = document.getElementById('href').href; var interval = setInterval(function() { var time = --wait.innerHTML; if (time <= 0) { location.href = href; clearInterval(interval); }; }, 1000); })(); </script> <include file="Public:footer"/>
退出登录时在退出成功后调用以下代码,若需要跳转,同登录类似,也需要借助跳转页进行。
7.项目注册后论坛同步用户信息
在项目网站注册时需同时向以下数据表插入用户数据
common_member、common_member_status、common_member_profile、common_member_field_forum、common_member_field_home、common_member_account等以保证用户被激活,注意哪些字段不能为空。
8.论坛注册后同步到用户信息
与第7条类似,在discuz注册方法中将用户信息添加到项目网站相关数据表即可(对discuz了解较少,未实现)
原文:http://blog.csdn.net/eric__cui/article/details/52459839