版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、PHP版单点登陆实现方案 摘要:本文主要介绍了利用webservice,session,cookie技术,来进行通用的单点登录系统的分析与设计。具体实现语言为PHP。单点登录,英文名为Single Sign On,简称为 SSO,是目前企业,网络业务的用户综合处理的重要组成部分。而SSO的定义,是在多个应用系统中,用户只需要登陆一次就可以访问所有相互信任的应用系统。一. 登陆原理说明单点登录的技术实现机制:当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭据ticket;用户再访
2、问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。可以看出,要实现SSO,需要以下主要的功能:a) 所有应用系统共享一个身份认证系统;b) 所有应用系统能够识别和提取ticket信息;c) 应用系统能够识别已经登录过的用户,能自动判断当前用户是否登录过,从而完成单点登录的功能基于以上基本原则,本人用php语言设计了一套单点登录系统的程序,目前已投入正式生成服务器运行。本系统程序,将ticket信息以全系统唯一的sess
3、ion id作为媒介,从而获取当前在线用户的全站信息(登陆状态信息及其他需要处理的用户全站信息)。二. 过程说明:登陆流程:1. 第一次登陆某个站:a) 用户输入用户名+密码,向用户验证中心发送登录请求b) 当前登录站点,通过webservice请求,用户验证中心验证用户名,密码的合法性。如果验证通过,则生成ticket,用于标识当前会话的用户,并将当前登陆子站的站点标识符记录到用户中心,最后c) 将获取的用户数据和ticket返回给子站。如果验证不通过,则返回相应的错误状态码。d) 根据上一步的webservice请求返回的结果,当前子站对用户进行登陆处理:如状态码表示成功的话,则当前站点通
4、过本站cookie保存ticket,并本站记录用户的登录状态。状态码表示失败的话,则给用户相应的登录失败提示。2. 登陆状态下,用户转到另一子:a) 通过本站cookie或session验证用户的登录状态:如验证通过,进入正常本站处理程序;否则户中心验证用户的登录状态(发送ticket到用户验证中心),如验证通过,则对返回的用户信息进行本地的登录处理,否则表明用户未登录。登出流程a) 当前登出站清除用户本站的登录状态 和 本地保存的用户全站唯一的随机idb) 通过webservice接口,清除全站记录的全站唯一的随机id。webservice接口会返回,登出其他已登录子站的javascript
5、代码,本站输出此代码。c) js代码访问相应站W3C标准的登出脚本用户单点登陆示意图三. 代码说明:本文所涉及到相关代码,已打包上传,如有兴趣,可在本文最后下载链接处点击下载。1. 登陆流程:用户从打开浏览器开始,第一个登陆的子站点,必须调用UClientSSO:loginSSO()方法。该方法返回全站唯一的随机id用于标识该用户。该随机id在UClientSSO:loginSSO()中已通过本站cookie保存,即该子站点保留了用户已登陆标识的存根于本站。a) UClientSSO:loginSSO()方法如下:/* * 用户验证中心 登陆用户处理 * * param string $use
6、rname - 用户名 * param string $password - 用户原始密码 * param boolean $remember - 是否永久记住登陆账号 * param boolean $alreadyEnc - 传入的密码是否已经经过simpleEncPass加密过 * * return array - integer $returnstatus 大于 0:返回用户 ID,表示用户登录成功 * -1:用户不存在,或者被删除 * -2:密码错 * -11:验证码错误 * string $returnusername : 用户名 * string $returnpassword
7、: 密码 * string $returnemail : 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:simpleEncPas
8、s(trim($password),ip = self:onlineip(),siteFlag = self:$site,remember = $remember);$_paramschecksum = self:_getCheckSum($_paramsusername . $_paramspassword .$_paramsip . $_paramssiteFlag . $_paramsremember);/ 2.调用webservice接口,进行登陆处理/$aRet = self:_callSoap(loginUCenter, $_params);if (intval($aRetresu
9、ltFlag) > 0 && $aRetsessID) /成功登陆/设置本地session idself:_setLocalSid($aRetsessID);/设置用户中心的统一session id脚本路径self:$_synloginScript = urldecode($aRetscript);$ret = $aRetuserinfo; else $retstatus = $aRetresultFlag;return $ret;/end of functionb) 用户验证中心的webservice服务程序,接收到登陆验证请求后,调用UCenter:loginUCen
10、ter()方法来处理登陆请求。/* * 用户验证中心 登陆用户处理 * * 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 = l
11、ogin_user($username, $password, $ip);$res_login = $arr_login_resstatus;/$retresultFlag = $res_login;if ($res_login < 1) /登陆失败 else /登陆成功$_SESSIONself:$_ucSessKey = $arr_login_res;$_SESSIONself:$_ucSessKeysalt =self:_getUserPassSalt($_SESSIONself:$_ucSessKeyusername, $_SESSIONself:$_ucSessKeypassw
12、ord);$retuserinfo = $_SESSIONself:$_ucSessKey;$retsessID = session_id();/生成全站的唯一session id,作为ticket全站通行/合作中心站回调登陆接口(设置用户中心的统一session id)/self:_createCoSitesInfo();$uinfo = array();$_timestamp = time();$_rawCode = array(action = setSid,sid = $retsessID,time = $_timestamp,);if ($remember) $uinfo = arr
13、ay(remember = 1,username = $username,password = $password);$retscript = ;$_rawStr = http_build_query(array_merge($_rawCode, $uinfo);/ 合作站点的全域cookie设置脚本地址/foreach (array)self:$_coSitesInfo as $_siteInfo) $_code = self:authcode($_rawStr, ENCODE, $_siteInfokey);$_src = $_siteInfourl . ?code= . $_code .
14、 &time= . $_timestamp;$retscript .= urlencode();/ 记住已登陆战/self:registerLoggedSite($siteFlag, $retsessID);unset($retuserinfosalt);return $ret;2. 本站登陆成功后,进行本地化的用户登陆处理,其后验证用户是否登陆只在本地验证。(本地存取登陆用户状态的信息,请设置为关闭浏览器就退出)3. 当检测用户登陆状态时,请先调用本地的验证处理,若本地验证不通过,再调用UClientSSO:checkUserLogin()方法到用户中心检测用户的登陆状态。a) UC
15、lientSSO:checkUserLogin()方法如下:/* * 用户单点登陆验证函数 * * return array - integer $returnstatus 大于 0:返回用户 ID,表示用户登录成功 * 0:用户没有在全站登陆 * -1:用户不存在,或者被删除 * -2:密码错 * -3:未进行过单点登陆处理 * -11:验证码错误 * string $returnusername : 用户名 * string $returnpassword : 密码 * string $returnemail : Email */public static function checkUs
16、erLogin()self:_init();$ret = array();$_sessId = self:_getLocalSid();if (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:$_a
17、uthcodeKey);$username = $_userinfo0;$password = isset($_userinfo1) ? $_userinfo1 : ;if (empty($password) $retstatus = -3; else return self:loginSSO($username, $password, true, true); else $retstatus = -3; else /本站原先已经登陆过,通过保留的sesson id存根去用户中心验证/$_params = array(sessId = $_sessId,siteFlag = self:$sit
18、e,checksum = md5($_sessId . self:$site . self:$_mcComunicationKey);$aRet = self:_callSoap(getOnlineUser, $_params);if (intval($aRetresultFlag) > 0) /成功登陆$ret = $aRetuserinfo; else $retstatus = $aRetresultFlag;return $ret;b) 用户验证中心的webservice服务程序,接收到检验登陆的请求后,调用UCenter:getOnlineUser()方法来处理登陆请求:/* *
19、 根据sid,获取当前登陆的用户信息 * * param string $sessId- 全站唯一session id,用做ticket * return array */* * 根据sid,获取当前登陆的用户信息 * * param string $sessId- 全站唯一session id,用做ticket * return array */static public function getOnlineUser($sessId, $siteFlag) self:_init();session_id(trim($sessId);session_start();$ret = array()
20、;$_userinfo = $_SESSIONself:$_ucSessKey;if (isset($_userinfousername) && isset($_userinfopassword) &&self:_getUserPassSalt($_userinfousername, $_userinfopassword) $retresultFlag = 1;$retuserinfo = $_userinfo;self:registerLoggedSite($siteFlag, $sessId);/记住已登陆战unset($retuserinfosalt);
21、else $retresultFlag = 0;return ($ret);4. 单点登出时,调用UClientSSO:logoutSSO()方法。调用成功后,如需其他已登陆站立即登出,请调用 UClientSSO:getSynloginScript()方法获取W3C标准的script,在页面输出。a) UClientSSO:logoutSSO()方法如下:/* * 全站单点登出 * - 通过webservice请求注销掉用户的全站唯一标识 * * return integer 1: 成功 * -11:验证码错误 */public static function logoutSSO()self
22、:_init();$_sessId = self:_getLocalSid();/本站没有登陆的话,不让同步登出其他站/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, $_params);if (intval($aRet
23、resultFlag) > 0) /成功登出self:_removeLocalSid();/移除本站记录的sid存根self:$_synlogoutScript = urldecode($aRetscript);$ret = 1; else $ret = $aRetresultFlag;return intval($ret);b) 用户验证中心的webservice服务程序,接收到全站登出请求后,调用UCenter:loginUCenter()方法来处理登陆请求:/* * 登出全站处理 * * param string - 全站唯一session id,用做ticket * return
24、 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部署在hostname/webapps/port/ UserSvc.php中。查看wsdl内容,请访问https:/hostname/
25、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部署在用户中心服务客户端目录下。部署好后,请修改最后一行的UClientSSO:setSite(1); 参数值为用户验证中心统一分配给各站的标识id.b) 在部署的用户中心服务客户端包下的api目录下下,请将logout_sso.php脚本转移到此处,并编写进行本
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《习题及答案》课件
- 药物治疗颈外动脉闭塞长期效果-洞察分析
- 线下体验式营销升级-洞察分析
- 水污染生物降解机制-洞察分析
- 虚拟农场规划与管理-洞察分析
- 心脏扩大康复训练策略-洞察分析
- 先进制造技术在航空应用-洞察分析
- 脱硫自动化控制-洞察分析
- 《v消费者市场分析》课件
- 糖果巧克力市场趋势分析-洞察分析
- 邓州市龙理乡第一初级中学-2025年春节寒假跨学科主题实践作业模板【课件】
- 酒店宴会服务合同三篇
- 2024-2025学年上学期北京初中物理九年级期末培优试卷
- 2023-2024学年北京海淀区初三(上)期中化学试题及答案
- 1、2024广西专业技术人员继续教育公需科目参考答案(98分)
- 2024年社区工作者考试必考1000题【历年真题】
- 2023-2024学年广东省深圳市福田区八年级(上)期末历史试卷
- 律师行业职业操守与违纪警示发言稿
- 塑料污染与环境保护
- 中华人民共和国民法典(总则)培训课件
- IB课程-PYP小学项目省公开课获奖课件说课比赛一等奖课件
评论
0/150
提交评论