栏目导航
热点推荐
- 开发者必备,超实用的PHP代码片
- 提高PHP编程效率的53种方法
- PHP精华的代码收藏
- PHP.ini配置文件(中文)
- PHP如何防止注入及开发安全
- 提高PHP编程效率的53个要点
- 实际开发中可能用到的PHP的字符
- PHP无限分类的原理
- PHP验证码类代码( 最新修改,完全
- PHP判断端口是否打开的代码
- PHP网站转移实战经验之谈
- phpMyAdmin配置文件说明
阅览排行
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的内容