版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、PHP版单点登陆实现方案 摘要:本文主要介绍了利用webservice,session,cookie技术,来进行通用的单点登录系统的分析与设计。具体实现语言为PHP。单点登录,英文名为Single Sign On,简称为 SSO,是目前企业,网络业务的用户综合处理的重要组成部分。而SSO的定义,是在多个应用系统中,用户只需要登陆一次就可以访问所有相互信任的应用系统。一. 登陆原理说明单点登录的技术实现机制:当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭
2、据ticket;用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。可以看出,要实现SSO,需要以下主要的功能:a) 所有应用系统共享一个身份认证系统;b) 所有应用系统能够识别和提取ticket信息;c) 应用系统能够识别已经登录过的用户,能自动判断当前用户是否登录过,从而完成单点登录的功能基于以上基本原则,本人用php语言设计了一套单点登录系统的程序,目前已投入正式生成服务器运行。本系统程序,将ticket信
3、息以全系统唯一的session id作为媒介,从而获取当前在线用户的全站信息(登陆状态信息及其他需要处理的用户全站信息)。二. 过程说明:登陆流程:1. 第一次登陆某个站:a) 用户输入用户名+密码,向用户验证中心发送登录请求b) 当前登录站点,通过webservice请求,用户验证中心验证用户名,密码的合法性。如果验证通过,则生成ticket,用于标识当前会话的用户,并将当前登陆子站的站点标识符记录到用户中心,最后c) 将获取的用户数据和ticket返回给子站。如果验证不通过,则返回相应的错误状态码。d) 根据上一步的webservice请求返回的结果,当前子站对用户进行登陆处理:如状态码表
4、示成功的话,则当前站点通过本站cookie保存ticket,并本站记录用户的登录状态。状态码表示失败的话,则给用户相应的登录失败提示。2. 登陆状态下,用户转到另一子:a) 通过本站cookie或session验证用户的登录状态:如验证通过,进入正常本站处理程序;否则户中心验证用户的登录状态(发送ticket到用户验证中心),如验证通过,则对返回的用户信息进行本地的登录处理,否则表明用户未登录。登出流程a) 当前登出站清除用户本站的登录状态 和 本地保存的用户全站唯一的随机idb) 通过webservice接口,清除全站记录的全站唯一的随机id。webservice接口会返回,登出其他已登录子
5、站的javascript代码,本站输出此代码。c) js代码访问相应站W3C标准的登出脚本用户单点登陆示意图三. 代码说明:本文所涉及到相关代码,已打包上传,如有兴趣,可在本文最后下载链接处点击下载。1. 登陆流程:用户从打开浏览器开始,第一个登陆的子站点,必须调用UClientSSO:loginSSO()方法。该方法返回全站唯一的随机id用于标识该用户。该随机id在UClientSSO:loginSSO()中已通过本站cookie保存,即该子站点保留了用户已登陆标识的存根于本站。a) UClientSSO:loginSSO()方法如下:/* * 用户验证中心 登陆用户处理 * * param
6、 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'
7、 : 用户名 * 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' =>
8、; $username,'password' => $alreadyEnc ? trim($password) : self:simpleEncPass(trim($password),'ip' => self:onlineip(),'siteFlag' => self:$site,'remember' => $remember);$_params'checksum' = self:_getCheckSum($_params'username' . $_params'
9、password' .$_params'ip' . $_params'siteFlag' . $_params'remember'); / 2.调用webservice接口,进行登陆处理/$aRet = self:_callSoap('loginUCenter', $_params); if (intval($aRet'resultFlag') > 0 && $aRet'sessID') /成功登陆/设置本地session i
10、dself:_setLocalSid($aRet'sessID'); /设置用户中心的统一session id脚本路径self:$_synloginScript = urldecode($aRet'script'); $ret = $aRet'userinfo' else $ret'status' = $aRet'resultFlag' return $ret;/end of functionb) 用户验证中心的webservice服务程序,接收到登陆验证请求后,调用UCe
11、nter:loginUCenter()方法来处理登陆请求。/* * 用户验证中心 登陆用户处理 * * 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
12、_login_res = login_user($username, $password, $ip);$res_login = $arr_login_res'status'/$ret'resultFlag' = $res_login; if ($res_login < 1) /登陆失败 else /登陆成功$_SESSIONself:$_ucSessKey = $arr_login_res; $_SESSIONself:$_ucSessKey'salt' =self:_getUserPassSalt(
13、$_SESSIONself:$_ucSessKey'username', $_SESSIONself:$_ucSessKey'password'); $ret'userinfo' = $_SESSIONself:$_ucSessKey;$ret'sessID' = session_id();/生成全站的唯一session id,作为ticket全站通行 /合作中心站回调登陆接口(设置用户中心的统一session id)/self:_createCoSitesInfo();$uinfo = array();$_t
14、imestamp = time();$_rawCode = array('action' => 'setSid','sid' => $ret'sessID','time' => $_timestamp,);if ($remember) $uinfo = array('remember' => 1,'username' => $username,'password' => $password); $ret'scrip
15、t' = ''$_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 . '&a
16、mp;amp;time=' . $_timestamp;$ret'script' .= urlencode('<script src="' . $_src . '" type="text/javascript"><!-mce:0-></script>'); / 记住已登陆战/self:registerLoggedSite($siteFlag, $ret'sessID'); unset($ret'userinfo'
17、'salt'); return $ret;2. 本站登陆成功后,进行本地化的用户登陆处理,其后验证用户是否登陆只在本地验证。(本地存取登陆用户状态的信息,请设置为关闭浏览器就退出)3. 当检测用户登陆状态时,请先调用本地的验证处理,若本地验证不通过,再调用UClientSSO:checkUserLogin()方法到用户中心检测用户的登陆状态。a) UClientSSO:checkUserLogin()方法如下:/* * 用户单点登陆验证函数 * * return array - integer $return'status' 大于 0:返回用户 ID,
18、表示用户登录成功 * 0:用户没有在全站登陆 * -1:用户不存在,或者被删除 * -2:密码错 * -3:未进行过单点登陆处理 * -11:验证码错误 * string $return'username' : 用户名 * string $return'password' : 密码 * string $return'email' : Email */public static function checkUserLogin()self:_init();$ret = array();$_sessId = self:_getLocalSid();if
19、 (empty($_sessId) /永久记住账号处理if(isset($_COOKIE_UC_USER_COOKIE_NAME) && !empty($_COOKIE_UC_USER_COOKIE_NAME) / 根据cookie里的用户名和密码判断用户是否已经登陆。/$_userinfo = explode('|g|', self:authcode($_COOKIE_UC_USER_COOKIE_NAME, 'DECODE', self:$_authcodeKey); $username = $_user
20、info0;$password = isset($_userinfo1) ? $_userinfo1 : ''if (empty($password) $ret'status' = -3; else return self:loginSSO($username, $password, true, true); else $ret'status' = -3; else /本站原先已经登陆过,通过保留的sesson id存根去用户中心验证/$_params = array('sessId' => $_se
21、ssId,'siteFlag' => self:$site,'checksum' => md5($_sessId . self:$site . self:$_mcComunicationKey);$aRet = self:_callSoap('getOnlineUser', $_params);if (intval($aRet'resultFlag') > 0) /成功登陆$ret = $aRet'userinfo' else $ret'status' = $aRet
22、9;resultFlag' return $ret;b) 用户验证中心的webservice服务程序,接收到检验登陆的请求后,调用UCenter:getOnlineUser()方法来处理登陆请求:/* * 根据sid,获取当前登陆的用户信息 * * param string $sessId- 全站唯一session id,用做ticket * return array */* * 根据sid,获取当前登陆的用户信息 * * param string $sessId- 全站唯一session id,用做ticket * return array */static public
23、function getOnlineUser($sessId, $siteFlag) self:_init();session_id(trim($sessId);session_start(); $ret = array();$_userinfo = $_SESSIONself:$_ucSessKey; if (isset($_userinfo'username') && isset($_userinfo'password') &&self:_getUserPassSalt($_
24、userinfo'username', $_userinfo'password') $ret'resultFlag' = "1"$ret'userinfo' = $_userinfo; self:registerLoggedSite($siteFlag, $sessId);/记住已登陆战unset($ret'userinfo''salt'); else $ret'resultFlag' = "0" return ($ret)
25、;4. 单点登出时,调用UClientSSO:logoutSSO()方法。调用成功后,如需其他已登陆站立即登出,请调用 UClientSSO:getSynloginScript()方法获取W3C标准的script,在页面输出。a) UClientSSO:logoutSSO()方法如下:/* * 全站单点登出 * - 通过webservice请求注销掉用户的全站唯一标识 * * return integer 1: 成功 * -11:验证码错误 */public static function logoutSSO()self:_init();$_sessId = self:_getLocalSid
26、(); /本站没有登陆的话,不让同步登出其他站/if (empty($_sessId) self:_initSess(true);return false;$_params = array('sessId' => $_sessId,'siteFlag' => self:$site,'checksum' => md5($_sessId . self:$site . self:$_mcComunicationKey); $aRet = self:_callSoap('logoutUCenter',
27、 $_params);if (intval($aRet'resultFlag') > 0) /成功登出self:_removeLocalSid();/移除本站记录的sid存根self:$_synlogoutScript = urldecode($aRet'script');$ret = 1; else $ret = $aRet'resultFlag'return intval($ret);b) 用户验证中心的webservice服务程序,接收到全站登出请求后,调用UCenter:loginUCenter()方法来处理登陆请求:/*
28、* 登出全站处理 * * param string - 全站唯一session id,用做ticket * return boolean */static public function logoutUCenter($sessId) self:_init();session_id(trim($sessId);session_start(); $_SESSION = array();return empty($_SESSION) ? true : false;四. 代码部署:1. 用户验证中心设置a) 用户验证中心向分站提供的webservice服务接口文件,即UserSvc.php部
29、署在hostname/webapps/port/ UserSvc.php中。查看wsdl内容,请访问https:/hostname/port/ UserSvc.php?wsdlb) 用户中心用户单点服务类文件为UCenterSSO.class.php,文件路径为在hostname/webapps/include/UCenterSSO.class.php。该文件为用户单点登陆处理 的服务端类,被hostname/webapps/port/ UserSvc.php调用。用于获取用户的登陆信息,是否单点登陆的状态信息,单点登出处理等。c) 用户验证中心通过W3C标准,利用cookie方式记录,删除全站统一的用户唯一随机id 的脚本文件为hostname/webapps/port/cookie_mgr.php.2. 子站点设置a) 各子站点请将,UClientSSO.class.php部署在用户中心服务客户端目录下。部署好后,请修改最后一行的UCli
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年生产数据统计申报表
- 高中生通过地理空间分析探讨城市建筑节能改造对空气污染缓解作用课题报告教学研究课题报告
- 2026宁波海港人力资源服务有限公司玉环分公司招聘5人考试备考题库及答案解析
- 2026辽宁沈阳建筑大学招聘高层次人才44人(第一批)考试参考题库及答案解析
- 2026四川雅安雨城区陆军第九五六医院社会招聘3人笔试参考题库及答案解析
- 2026年甘肃省平凉市灵台县选调一般工作人员37人笔试参考题库及答案解析
- 2026年职业病防治攻坚专项计划
- 2026年人才激励制度、如何建立新的人才激励机制
- 2026四川绵阳市北川羌族自治县总医院中羌医医院院区招聘编外卫生专技人员4人笔试备考试题及答案解析
- 八、主体结构加固主要方法或方案和施工措施
- (正式版)DB42∕T 2413-2025 《退役军人志愿服务队伍建设与管理规范》
- JJF(晋) 150-2025 肠内营养泵校准规范
- 饲料标签培训
- 《公路雪害防治技术指南》
- 转租鱼塘合同协议书范本
- 《医学影像检查技术学》课件-口腔X线摄影
- 委托书代办发工资范本
- 2024低温阀门深冷处理规范
- 房屋抵押个人借款协议样式
- 2023年新高考河北卷政治高考真题解析(参考版)
- 部编人教版四年级下册小学数学全册课时练(一课一练)
评论
0/150
提交评论