thinkphp3.2.3,discuz 同步登录实现方案

作者: wxfeng 分类: 未分类 发布时间: 2017-09-23 00:00


ucenter同步登录原理


为了顺利解决部署过程中可能出现的问题,推荐笔友们先阅读一下这篇文章《简单分析ucenter 会员同步登录通信原理》,明白部署中各个步骤的作用。

部署过程记录


1. 下载附件

api.zipThinkphpUcenter.zip,分别解压后,将源码与ThinkPHP框架部署如下:

image.png

按照上图部署完项目目录后进入下一步,关于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代码如下

  1. protected function _initialize()  

  2. {  

  3.     if (checkLogin()) {  

  4.         $this->autologin();  

  5.     }  

  6. }  

  7.   

  8. public function autologin()  

  9. {  

  10.     if (isset($_COOKIE['8asp_2132_auth']) && !empty($_COOKIE['8asp_2132_auth'])) {  

  11.         Vendor('ThinkphpUcenter.UcApi');//载入UcApi扩展  

  12.         $key = md5(C('AUTH_KEY') . $_COOKIE['8asp_2132_saltkey']);//获取在本应用的配置文件config.php中的解密钥匙  

  13.         $userMsg = explode("\t", uc_authcode($_COOKIE['8asp_2132_auth'], 'DECODE'$key)); //得到加了密的password【$userMsg[0]】和uid【$userMsg[1]】  

  14.         $userInfo = uc_get_user($userMsg[1], 1);//通过uid获取username  

  15.         $_SESSION['user_id'] = $userMsg[1];  

  16.         $_SESSION['username'] = $userInfo[1];  

  17.         $_SESSION['email'] = $userInfo[2];  

  18.         $member = D('member')->where('user_name ="' . $userInfo[1] . '"')->find();  

  19.         session('member'$member);  

  20.     } else {  

  21.         //do something  

  22.     }  

  23. }  

其中$_COOKIE['8asp_2132_auth']中的8asp可通过dump($_COOKIE);来获取将此代码段中的四处$_COOKIE['XXXX_2132_XXXX']替换为dump出的前缀。

完成后在项目登录方法中登录验证成功后添加如下代码:

  1. vendor('ThinkphpUcenter.UcApi');  

  2. $login = UcApi::login($member['user_name'],$pass);  

  3. if (!$login){  

  4.     $this->error('同步登录失败','/Index/index');  

  5. }  

  6. echo $login['synlogin'];//这一步一定添加,此处输出的为同步登录的js代码,若使用ajax传值此处应别做处理  

  7. //redirect('jumpurl') //错误,同步登录失败

这里有个地方需要注意:在登录成功后跳转至其他页面时,因为需要留有时间执行同步登录返回的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"/>

退出登录时在退出成功后调用以下代码,若需要跳转,同登录类似,也需要借助跳转页进行。

  1. vendor('ThinkphpUcenter.UcApi');  

  2. echo UcApi::logout();//输出同步登出的代码 与登录时类似  

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

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注