首页
站长论坛BBS
救助
投稿
discuz视频教程
discuz技术支持
版块
登录
快速注册

Discuz的Ucenter整合第三方应用mlecms的开发过程记录

建站高手 2015-6-25 [Discuz开发] 来自PC 复制链接
56081
discuz使用视频教程
31idc

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
UCenter添加对接应用的步骤就省略了,看这篇文章之前建议先看看:Discuz的Ucenter会员同步登录原理,下面就对mlecms的登录、登出、和注册页面进行一些修改,来达到与discuz同步的目的。

你需要一本ucenter接口开发手册,方便你顺利的实现下面的步骤。下载地址:ucenter接口开发手册

(1)我们先来实现双向同步登录,也就是用户在mlecms里登录,转到discuz里也是登录状态,反过来也一样。

首先在mlecms登录文件里,加入同步登录的代码,我们找到mlecms的登录页面member/login.php:
(注意:要使用uc的同步接口函数,先要引用:config.inc.php和uc_client/client.php这两个文件)

  1. if(!empty($_POST['username']) && !empty($_POST['password'])){  
  2.     $captcha = true;  
  3.     if($mle['login_captcha']){  
  4.         $img = new captcha();  
  5.         $captcha = $img->check($_POST['captcha']);  
  6.     }  
  7.     if($captcha === true){  
  8.         $flag = member::login($_POST['username'],$_POST['password'],numeric($expire));  
  9.         switch($flag){  
  10.             case 0 : msgbox($language['page']['not_exist'],$config['url'].misc::url('login')); break;   
  11.             case -1 : msgbox($language['page']['password_error'],$config['url'].misc::url('login')); break;   
  12.             case -2 : msgbox($language['page']['mail_activation'],$config['url'].misc::url('login')); break;   
  13.             case -3 : msgbox($language['page']['manage_activation'],$config['url'].misc::url('login')); break;   
  14.             case -4 : msgbox($language['page']['refused_login'],$config['url'].misc::url('login')); break;   
  15.             case -5 : msgbox($language['page']['unknown_error'],$config['url'].misc::url('login')); break;   
  16.             default :  
  17.                 msgbox('',$config['url'].'member/');  
  18.             break;  
  19.         }  
  20.     } else {   
  21.         msgbox($language['page']['captcha_error'],$config['url'].misc::url('login'));  
  22.     }  
  23. }  
复制代码


根据 ucenter接口开发手册和UCenter_1.6.0_SC_UTF8文件夹里login_db.php例子,添加了同步登录的代码,如下:

  1. if(!empty($_POST['username']) && !empty($_POST['password'])){  
  2.     $captcha = true;  
  3.     if($mle['login_captcha']){  
  4.         $img = new captcha();  
  5.         $captcha = $img->check($_POST['captcha']);  
  6.     }  
  7.     if($captcha === true){  
  8.         $flag = member::login($_POST['username'],$_POST['password'],numeric($expire));  
  9.         switch($flag){  
  10.             case 0 : msgbox($language['page']['not_exist'],$config['url'].misc::url('login')); break;   
  11.             case -1 : msgbox($language['page']['password_error'],$config['url'].misc::url('login')); break;   
  12.             case -2 : msgbox($language['page']['mail_activation'],$config['url'].misc::url('login')); break;   
  13.             case -3 : msgbox($language['page']['manage_activation'],$config['url'].misc::url('login')); break;   
  14.             case -4 : msgbox($language['page']['refused_login'],$config['url'].misc::url('login')); break;   
  15.             case -5 : msgbox($language['page']['unknown_error'],$config['url'].misc::url('login')); break;   
  16.             default :  
  17.                 //通过接口判断登录帐号的正确性,返回值为数组  
  18.                 list($uid, $username, $password, $email) = uc_user_login($_POST['username'], $_POST['password']);  
  19.   
  20.                 setcookie('auth', '', -86400);  
  21.                 if($uid > 0) {  
  22.         /*          if(!$db->result_first("SELECT count(*) FROM {$tablepre}members WHERE uid='$uid'")) {
  23.                         //判断用户是否存在于用户表,不存在则跳转到激活页面
  24.                         $auth = rawurlencode(uc_authcode("$username\t".time(), 'ENCODE'));
  25.                         echo '您需要需要激活该帐号,才能进入本应用程序<br><a href="'.$_SERVER['PHP_SELF'].'?example=register&action=activation&auth='.$auth.'">继续</a>';
  26.                         exit;
  27.                     } */  
  28.                     //用户登陆成功,设置 Cookie,加密直接用 uc_authcode 函数,用户使用自己的函数  
  29.                     setcookie('auth', uc_authcode($uid."\t".$username, 'ENCODE'));  
  30.                     //生成同步登录的代码  
  31.                     $ucsynlogin = uc_user_synlogin($uid);  
  32.                     echo '登录成功'.$ucsynlogin.'<br><a href="'.$_SERVER['PHP_SELF'].'">继续</a>';  
  33.                     msgbox('',$config['url'].'member/');  
  34.                 } elseif($uid == -1) {  
  35.                     msgbox( '用户不存在,或者被删除',$config['url'].misc::url('login'));  
  36.                 } elseif($uid == -2) {  
  37.                     msgbox( '密码错',$config['url'].misc::url('login'));  
  38.                 } else {  
  39.                     msgbox( '未定义',$config['url'].misc::url('login'));  
  40.                 }  
  41.             break;  
  42.         }  
  43.     } else {   
  44.         msgbox($language['page']['captcha_error'],$config['url'].misc::url('login'));  
  45.     }  
  46. }  
复制代码


测试:在discuz里注册一个用户名为test的用户,因为discuz与ucenter里的同步已经写好的,ucenter里也会有这个用户,在mlecms里也注册一个用户名为test的用户,然后我们在mlecms里用这个用户登录,成功;转到discuz页面,用户也是登录状态。

下面修改mlecms的api/uc.php文件,修改synlogin 函数,加入同步登录代码:

  1. function synlogin($get, $post) {  
  2.         $uid = $get['uid'];  
  3.     $username = $get['username'];  
  4.     //$pwd = $get['password'];  
  5.       
  6.     global $_G;  
  7.       
  8.     if(!API_SYNLOGIN) {  
  9.         return API_RETURN_FORBIDDEN;  
  10.     }  
  11.     header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');  
  12.     header("Location:../member/login.php?username=$username&uid=$uid");//同步登录  
  13. }  
复制代码

修改mlecms/inc/class/member.class.php,新增加一个synclogin函数,来使用用户名和用户id实现登录:

  1. public static function synclogin($username,$uid,$expire = 0){  
  2.     global $db,$gmt_time;  
  3.     $username = trim(preg_replace('/[\'\"\\\\\/]/','',$username));  
  4.     $uid = trim(preg_replace('/[\'\"\\\\\/]/','',$uid));  
  5.     $row = $db->query("SELECT a.*,b.`rankname` FROM `{$db->prefix}members` a,`{$db->prefix}rank` b WHERE (a.`username` = '{$username}' || a.`email` = '{$username}') && a.`level` = b.`id` && a.`id` = '{$uid}' LIMIT 1",1);  
  6.     if(isset($row['username'])){  
  7.         //if(md5(md5($password).md5($row['encryption'])) == $row['password']){   
  8.             if($row['audit'] == 0 && $row['effective']){                  
  9.                 $expire != 0 && $expire = $gmt_time + ($expire * 3600);   
  10.                 setcookie('mlecms_user_login',encryption('mlecms','ENCOD',WEBKEY),$expire,'/');   
  11.                 setcookie('mlecms_user_id',encryption($row['id'],'ENCOD',WEBKEY),$expire,'/');   
  12.                 setcookie('mlecms_user_auth',encryption($row['id'].$row['password'].$row['encryption'],'ENCOD',WEBKEY),$expire,'/');   
  13.                 setcookie('mlecms_user_name',$row['username'],$expire,'/');   
  14.                 setcookie('mlecms_user_email',$row['email'],$expire,'/');   
  15.                 setcookie('mlecms_user_frequency',$row['frequency'] + 1,$expire,'/');   
  16.                 $rankname = explode(',',$row['rankname']);  
  17.                 $rankname = $rankname[LANG - 1];  
  18.                 setcookie('mlecms_user_rankname',$rankname ,$expire,'/');   
  19.                 setcookie('mlecms_user_money',$row['money'],$expire,'/');   
  20.                 setcookie('mlecms_user_usemoney',$row['usemoney'],$expire,'/');   
  21.                 setcookie('mlecms_user_scores',$row['scores'],$expire,'/');   
  22.                 $ip = explode(',',$row['loginip']);  
  23.                 $ip = $ip[1].','.get_ip();  
  24.                 $tm = explode(',',$row['logintime']);  
  25.                 $last_time = is_numeric($tm[1]) ? $tm[1] : numeric($tm[0]);   
  26.                 $tm = $tm[1].','.$gmt_time;  
  27.                 $integral = numeric($row['scores']);  
  28.                 if($last_time && $last_time < ($gmt_time - 43200)){  
  29.                     $member_config = self::get_config();  
  30.                     $integral += $member_config['login_scores'];  
  31.                 }  
  32.                 $level = self::get_upgrade_rank($row['level'],$integral,$row['money']);  
  33.                 $db->execute("UPDATE `{$db->prefix}members` SET `loginip` = '{$ip}',`logintime` = '{$tm}',`frequency` = (`frequency`+1),`scores` = '{$integral}',`level` = '{$level}' WHERE `id` = '{$row['id']}';");  
  34.                 return is_numeric($row['id']) ? $row['id'] : -5;   
  35.             } elseif ($row['audit'] == 1){  
  36.                 return -2;   
  37.             } elseif ($row['audit'] == 2){  
  38.                 return -3;  
  39.             } elseif ($row['effective'] == 0){  
  40.                 return -4;   
  41.             } else {  
  42.                 return -5;   
  43.             }  
  44.         //} else {  
  45.         //  return -1;   
  46.         //}  
  47.     } else {  
  48.         return 0;   
  49.     }  
  50. }  
复制代码

下面需要修改member/login.php页面,加入使用get方式登录的代码:

  1. if(!empty($_GET['username'])&&!empty($_GET['uid']))  
  2. {            
  3.     $syn_flag = member::synclogin($_GET['username'],$_GET['uid'],numeric($expire));  
  4.     switch($syn_flag){  
  5.         case 0 : msgbox($language['page']['not_exist'],$config['url'].misc::url('login')); break;   
  6.         case -1 : msgbox($language['page']['password_error'],$config['url'].misc::url('login')); break;   
  7.         case -2 : msgbox($language['page']['mail_activation'],$config['url'].misc::url('login')); break;   
  8.         case -3 : msgbox($language['page']['manage_activation'],$config['url'].misc::url('login')); break;   
  9.         case -4 : msgbox($language['page']['refused_login'],$config['url'].misc::url('login')); break;   
  10.         case -5 : msgbox($language['page']['unknown_error'],$config['url'].misc::url('login')); break;   
  11.         default : msgbox('',$config['url'].'member/'); break;  
  12.     }  
  13.          
  14. }  
复制代码


测试:使用test用户在discuz登录,转到mlecms页面,用户也为登录状态,同步成功。
(注意:要使这一步顺利实现,需要到discuz后台->界面->界面设置->全局 里把登录和注册的浮动窗口的勾去掉,因为没去掉这个勾的原因我一上午没成功,大家不要在走弯路喽)
至此,双向同步登录已经基本实现。

(2)实现双向同步登出,也就是用户在mlecms里登出,转到论坛也是登出状态。

mlecms里的login.php的登录代码:

  1. $action == 'logout' && member::logout() && msgbox('',$config['url']);  

  2. 加入同步登出代码:
  3. [php] view plaincopyprint?
  4. if($action == 'logout' && member::logout())  
  5. {   
  6.     echo uc_user_synlogout(); //同步退出  
  7.     msgbox('',$config['url']);  
  8. }  
复制代码

测试:在mlecms使用户退出登录,转到discuz页面,用户也为登出状态,同步登出成功。

下一步,修改api/uc.php里的synlogout函数,加入登出代码:

  1. function synlogout($get, $post) {  
  2.     if(!API_SYNLOGOUT) {  
  3.         return API_RETURN_FORBIDDEN;  
  4.     }  
  5.   
  6.     //note 同步登出 API 接口  
  7.     header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');  
  8.     header("Location:../member/login.php?action=logout");//同步登出  
  9. }
复制代码


测试:在discuz使test用户退出登录,转到mlecms页面,用户也为登出状态,同步登出成功。



上一篇:Discuz X 实现单版论坛的方法
下一篇:给触屏版发帖及回复时加入表情图片
梦忧之殇 发表于 2015-6-25 20:57:02 来自PC
看了一大堆,都没怎么看懂,这东西太高深了
http://caiyun.feixin.10086.cn/
cmjgj 发表于 2015-6-26 11:31:49 来自PC
也不知道怎么说,对这没有深入了解啊
洋洋 发表于 2015-6-26 13:55:05 来自PC
强烈支持,站帮网有你更精彩
http://www.02lx.com http://www.xcyy0451.com
jacknewab 发表于 2015-6-26 13:57:25 来自PC
回帖不支持下,期待更多分享。
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

快速回复 返回顶部 返回列表