首页 | 源码下载 | 网站模板 | 网页特效 | 广告代码 | 网页素材 | 字体下载 | 书库 | 站长工具
会员投稿 投稿指南 RSS订阅
当前位置:主页>网络编程>PHP教程>资讯:PHP版单点登陆实现方案

PHP版单点登陆实现方案

www.jz123.cn  2009-05-25   来源:   PHPChina    责任编辑(袁袁)    我要投递新闻

  1. 登陆流程:

  用户从打开浏览器开始,第一个登陆的子站点,必须调用UClientSSO::loginSSO()方法。该方法返回全站唯一的随机id用于标识该用户。该随机id在UClientSSO::loginSSO()中已通过本站cookie保存,即该子站点保留了用户已登陆标识的存根于本站。

  a) UClientSSO::loginSSO()方法如下:

  [php]/**

  * 用户验证中心 登陆用户处理

  *

  * @param string $username - 用户名

  * @param string $password - 用户原始密码

  * @param boolean $remember - 是否永久记住登陆账号

  * @param boolean $alreadyEnc - 传入的密码是否已经经过simpleEncPass加密过

  *

  * @return array - integer $return['status'] 大于 0:返回用户 ID,表示用户登录成功

  * -1:用户不存在,或者被删除

  * -2:密码错

  * -11:验证码错误

  * string $return['username'] : 用户名

  * string $return['password'] : 密码

  * string $return['email'] : Email

  */

  static public function loginSSO($username, $password, $remember=false, $alreadyEnc=false) {

  self::_init();

  self::_removeLocalSid();

  $ret = array();

  //

  //1. 处理传入webservice接口的参数

  //

  $_params = array(

  'username' => $username,

  'password' => $alreadyEnc ? trim($password) : self::simpleEncPass(trim($password)),

  'ip' => self::onlineip(),

  'siteFlag' => self::$site,

  'remember' => $remember

  );

  $_params['checksum'] = self::_getCheckSum($_params['username'] . $_params['password'] .

  $_params['ip'] . $_params['siteFlag'] . $_params['remember']);

  //

  // 2.调用webservice接口,进行登陆处理

  //

  $aRet = self::_callSoap('loginUCenter', $_params);

  if (intval($aRet['resultFlag']) > 0 && $aRet['sessID']) {

  //成功登陆

  //设置本地session id

  self::_setLocalSid($aRet['sessID']);

  //设置用户中心的统一session id脚本路径

  self::$_synloginScript = urldecode($aRet['script']);

  $ret = $aRet['userinfo'];

  } else {

  $ret['status'] = $aRet['resultFlag'];

  }

  return $ret;

  }//end of function [/php]

  b) 用户验证中心的webservice服务程序,接收到登陆验证请求后,调用UCenter::loginUCenter()方法来处理登陆请求。

  [php]/**

  * 用户验证中心 登陆用户处理

  *

  * @param string $username

  * @param string $password

  * @param string $ip

  * @param string $checksum

  * @return array

  */

  static public function loginUCenter($username, $password, $ip, $siteFlag, $remember=false) {

  self::_init();

  session_start();

  $ret = array();

  $arr_login_res = login_user($username, $password, $ip);

  $res_login = $arr_login_res['status']; //

  $ret['resultFlag'] = $res_login;

  if ($res_login < 1) {

  //登陆失败

  } else {

  //登陆成功

  $_SESSION[self::$_ucSessKey] = $arr_login_res;

  $_SESSION[self::$_ucSessKey]['salt'] =

  self::_getUserPassSalt($_SESSION[self::$_ucSessKey]['username'], $_SESSION[self::$_ucSessKey]['password']);

  $ret['userinfo'] = $_SESSION[self::$_ucSessKey];

  $ret['sessID'] = session_id(); //生成全站的唯一session id,作为ticket全站通行

  //

  //合作中心站回调登陆接口(设置用户中心的统一session id)

  //

  self::_createCoSitesInfo();

  $uinfo = array();

  $_timestamp = time();

  $_rawCode = array(

  'action' => 'setSid',

  'sid' => $ret['sessID'],

  'time' => $_timestamp,

  );

  if ($remember) {

  $uinfo = array(

  'remember' => 1,

  'username' => $username,

  'password' => $password

  );

  }

  $ret['script'] = '';

  $_rawStr = http_build_query(array_merge($_rawCode, $uinfo));

  //

  // 合作站点的全域cookie设置脚本地址

  //

  foreach ((array)self::$_coSitesInfo as $_siteInfo) {

  $_code = self::authcode($_rawStr, 'ENCODE', $_siteInfo['key']);

  $_src = $_siteInfo['url'] . '?code=' . $_code . '&time=' . $_timestamp;

  $ret['script'] .= urlencode('');

  }

  //

  // 记住已登陆战

  //

  self::registerLoggedSite($siteFlag, $ret['sessID']);

  unset($ret['userinfo']['salt']);

  }

  return $ret;

  } [/php]

  2. 本站登陆成功后,进行本地化的用户登陆处理,其后验证用户是否登陆只在本地验证。(本地存取登陆用户状态的信息,请设置为关闭浏览器就退出)

  3. 当检测用户登陆状态时,请先调用本地的验证处理,若本地验证不通过,再调用UClientSSO::checkUserLogin()方法到用户中心检测用户的登陆状态。

上一篇:PHP写采集心得 下一篇:在HTML中利用js调用php的内容

评论总数:0 [ 查看全部 ] 网友评论


关于我们隐私版权广告服务友情链接联系我们网站地图