天天看点

ThinkPHP3.1.2整合UCenter详解(四)

本文转自:http://www.thinkphp.cn/topic/1557.html

有了帐号我们就可以来做同步登录了。

打开UcService.class.php文件,添加一个UC登录和一个登出的方法,代码到UCenter接口开发手册的用户接口那里找用户登录示例代码,把它复制过来,然后稍微更改一下,使其带有返回值,以便下一步的操作,代码如下:

  1. public function uc_login($username, $password){
  2. list($uid, $username, $password, $email) = uc_user_login($username, $password);
  3.  if($uid > 0) {
  4.  return array(
  5.  'uid' => $uid,
  6.  'username' => $username,
  7.  'password' => $password,
  8.  'email' => $email
  9.  );
  10.  } elseif($uid == -1) {
  11.  return '用户不存在,或者被删除';
  12.  } elseif($uid == -2) {
  13.  return '密码错误';
  14.  } elseif($uid == -3) {
  15.  return '安全提问错误';
  16.  } else {
  17.  return '未定义';
  18.  }
  19.  }

复制代码 继续在用户接口那里找到同步登录的代码示例,找到“uc_user_synlogin($uid);”其作用是执行同步登录,然后写成uc_synlogin方法如下:

  1. public function uc_synlogin($uid){
  2.  return uc_user_synlogin($uid);
  3.  }

复制代码 到这里UcService.class.php文件的登录方法已经写好,接下来打开前台W3note项目的控制器MemberAction.class.php文件写一个同步登录的方法,看代码:

  1. public function checkLogin() {
  2.  if(!$_POST['username']) $this->error('帐号错误!');
  3.  if(!$_POST['password']) $this->error('密码错误!');
  4.  if(empty($_POST['verify'])) $this->error('验证码必须!');
  5.  import("@.ORG.UcService");//导入UcService.class.php类
  6. $ucService = new UcService;
  7. $uidarray = $ucService->uc_login($_POST['username'], $_POST['password']);
  8.  //dump($uidarray);
  9. $loginurl=$ucService->uc_synlogin($uidarray);
  10. echo $loginurl;//输出同步登录代码,否则无法同步登录
  11.  if(!is_string($uidarray)){
  12.  //生成认证条件
  13. $map = array();
  14.  // 支持使用绑定帐号登录
  15. $map['username'] = $_POST['username'];
  16. $map["status"] = array('gt',0);
  17.  if($_SESSION['verify'] != md5($_POST['verify'])) {
  18. $this->error('验证码错误!');
  19.  }
  20. $memberinfo=$this->Member->where($map)->find();
  21.  if(false === $memberinfo) {
  22. $this->error('帐号不存在或已禁用!');
  23.  }elseif($memberinfo['status']==0){
  24. $this->error('帐号已禁用!');
  25.  }else {
  26. $password = pwdHash($_POST['password']);
  27.  if($memberinfo['password'] != $password) {
  28. $this->error('密码错误!');
  29.  }
  30. session(C('USER_AUTH_KEY'), $memberinfo['id']);
  31. session('email', $memberinfo['email'] );
  32. session('loginUserName', $memberinfo['loginUserName']);
  33. session('lastLoginTime', $memberinfo['lastLoginTime']);
  34. session('loginnum', $memberinfo['loginnum']);
  35. session('lastloginip', $memberinfo['lastloginip']);
  36.  //保存登录信息(相当于更新信息)
  37. $data = array();
  38. $data['id'] = $memberinfo['id'];
  39. $data['lastlogintime'] = time();
  40. $data['loginnum'] = array('exp','loginnum+1');
  41. $data['lastloginip'] = get_client_ip();
  42.  //$data['verify'] = $authInfo['verify'];
  43. $this->Member->save($data);
  44. $this->success('登录成功!',U('Member/index'));
  45.  }
  46.  }
  47.  }

复制代码 我们来看一下checkLogin()方法的执行过程。

在项目W3note注册的一个帐号,然后在项目W3note提交登录表单后,首先执行UCenter的登录,前面我们写了两个UCenter的登录方法,在调用之前需要使用“import("@.ORG.UcService");”把UcService.class.php文件加载进来,实例化后得到$ucService,然后就可以使用用$ucService访问UCenterr的登录方法uc_login,返回一个$uidarray值,$uidarray包函什么数据?使用“dump($uidarray);”打印出来,以便下一步的操作,打印结果如下:

  1. array(4) {
  2.  ["uid"] => string(1) "1"
  3.  ["username"] => string(5) "qqabc"
  4.  ["password"] => string(6) "123456"
  5.  ["email"] => string(9) "[email protected]"
  6.  }

复制代码 下一步就是以此$uidarray作为参数传给同步登录方法uc_synlogin($uidarray),最后echo 一下uc_synlogin($uidarray)的返回值$loginurl,就可以实现帐号"qqabc"在UCenter登录了。帐号"qqabc"在UCenter登录成功后程序将继续往下执行项目W3note的登录,这里就不多说了。最后的结果是,帐号"qqabc"实现了在UCenter和项目W3note的同步登录!