




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、PHP 版单点登陆实现方案摘要:本文主要介绍了利用 webservice,session,cookie 技术,来进行通用的单点登录系统的分析与设计。具体实现语言为 PHP。单点登录,英文名为 SingleSignOn,简称为 SSO,是目前企业,网络业务的用户综合处理的重要组成部分。 而 SSO 的定义, 是在多个应用系统中, 用户只需要登陆一次就可以访问所有相互信任的应用系统。一 .登陆原理说明单点登录的技术实现机制:当用户第一次访问应用系统 1 的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭据ti
2、cket;用户再访问别的应用的时候,就会将这个 ticket 带上,作为自己认证的凭据,应用系统接受到请求之后会把 ticket 送到认证系统进彳 f 效验,检查 ticket 的合法性。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统 2 和应用系统 3 了。可以看出,要实现 SSO,需要以下主要的功能:a)所有应用系统共享一个身份认证系统;b)所有应用系统能够识别和提取 ticket 信息;c)应用系统能够识别已经登录过的用户,能自动判断当前用户是否登录过,从而完成单点登录的功能基于以上基本原则,本人用 php 语言设计了一套单点登录系统的程序,目前已投入正式生成服务器运行。本系
3、统程序,将 ticket 信息以全系统唯一的 sessionid 作为媒介,从而获取当前在线用户的全站信息(登陆状态信息及其他需要处理的用户全站信息)。二 .过程说明:登陆流程:1 .第一次登陆某个站:a)用户输入用户名+密码,向用户验证中心发送登录请求b)当前登录站点,通过 webservice 请求,用户验证中心验证用户名,密码的合法性。如果验证通过,则生成ticket,用于标识当前会话的用户,并将当前登陆子站的站点标识符记录到用户中心,最后 c)将获取的用户数据和 ticket 返回给子站。如果验证不通过,则返回相应的错误状态码。d)根据上一步的 webservice 请求返回的结果,当
4、前子站对用户进行登陆处理:如状态码表示成功的话,则当前站点通过本站 cookie 保存 ticket,并本站记录用户的登录状态。状态码表示失败的话,则给用户相应的登录失败提示。2 .登陆状态下,用户转到另一子:a)通过本站 cookie 或 session 验证用户的登录状态:如验证通过,进入正常本站处理程序;否则户中心验证用户的登录状态(发送 ticket 到用户验证中心),如验证通过,则对返回的用户信息进行本地的登录处理,否则表明用户未登录。登出流程a)当前登出站清除用户本站的登录状态和本地保存的用户全站唯一的随机 idb)通过 webservice 接口,清除全站记录的全站唯一的随机 i
5、d。webservice 接口会返回,登出其他已登录子站的 javascript 代码,本站输出此代码。c)js 代码访问相应站 W3C 标准的登出脚本1.1,3收留上一步的WQtJKervice请求返回的结果,木站对用户进行登录处理验证通过进入正常的小%录状态下,轼到另一子站那Iicookie.,session-i用广行量状态”1前出站消除用户一站的登求状态更木地保用.R逆用二世的财 e(通过gbotvg僮旦请除全站记录的全拈*一flftMim2.声出流hJw曲service接II会返回.登出其他已登录干站的javascript代码,本站输出此代码口用户单点登陆示意图三.代码说明:本文所涉及
6、到相关代码,已打包上传,如有兴趣,可在本文最后下载链接处点击下载。1.登陆流程:%次号陶某个站同11 1用户输入用户名叶密码向我证中心发送#又请求1.1,2当前詈余站点, 通过webservice清求, 用 邢川中心照il中广名.香网的合注科.,立成-用于:记录,从用1将啡01验证不通过理11.在录流程返】技宙?;&小返回状态国3表率:验证不避过一刎用户验证q用户从打开浏览器开始,第一个登陆的子站点,必须调用 UClientSSO:loginSSO()方法。该方法返回全站唯一的随机 id 用于标识该用户。该随机 id 在 UClientSSO:loginSSO()中已通过本站cookie 保存
7、,即该子站点保留了用户已登陆标识的存根于本站。a)UClientSSO:loginSSO()方法如下:/*用户验证中心登陆用户处理*paramstring$username*paramstring$password*paramboolean$remember* paramboolean$alreadyEnc-simpleEncPass 力口密过* returnarray-integer$returnstatus返回用户 ID,表示用户登录成功* -1:用户不存在,或者被删除* -2:密他错*string用户名string用户名用户原始密码是否永久记住登陆账号传入的密码是否已经经过大于 0:$r
8、eturnusername* string$returnemail:Email* /staticpublicfunctionloginSSO($username,$password$remember=false,$alreadyEnc=false)self:_init();self:_removeLocalSid();$ret=array();/1.处理传入 webservice 接口的参数/$_params=array(username=$username,passwordself:simpleEncPassip=self:onlineip()siteFlag=self:$site,reme
9、mber=$remember);$_paramschecksum=self:_getCheckSum($_paramsusername$_paramspassword.$_paramsip.$_paramssiteFlag$_paramsremember);/2.调用 webservice 接口,进行登陆处理/$aRet=self:_callSoap(loginUCenter,$_params);=$alreadyEnc(trim($password?trim($password),if(intval($aRetresultFlag)>0&&$aRetsessID)/成功
10、登陆/设置本地 sessionidself:_setLocalSid($aRetsessID);/设置用户中心的统一 sessionid 脚本路径self:$_synloginScript=urldecode($aRetscript);$ret=$aRetuserinfo;else$retstatus=$aRetresultFlag;return$ret;/endoffunctionb)用户验证中心的 webservice 服务程序,接收到登陆验证请求后,调用 UCenter:loginUCenter()方法来处理登陆请求/*用户验证中心登陆用户处理* paramstring$username
11、* paramstring$password* paramstring$ip* paramstring$checksum* returnarray* /staticpublicfunctionloginUCenter($username/登陆失败else/登陆成功$arr_login_res$password,$ip,$siteFlagself 二_init();session_start();$ret=array();$arr_login_res$password,$ip);$res_login$retresultFlag$remember=false)=login_user($userna
12、me,=$arr_login_resstatus;=$res_login;/if($res_login<1)$_SESSIONself$_ucSessKeyself$_SESSIONself_getUserPassSalt$_ucSessKeysalt($_SESSIONself 二$_ucSessKeyusername,$_SESSIONself:$_ucSessKeypassword);$retuserinfo=$_SESSIONself:$_ucSessKey;$retsessID=session_id();成全站的唯一 sessionid,作为 ticket 全站通行/合作中心站
13、回调登陆接口(设置用户中心的统sessionid)/self:_createCoSitesInfo();$uinfo=array();$_rawCode=array(action=setSid,sid=$retsessID,time=$_timestamp,);if($remember)$uinfo=array(remember= 1,username= $usernamepassword= $password$retscript=;$_rawStr=http_build_query(array_merge($_rawCode,$uinfo);/生$_timestamp=time();/合作站
14、点的全域 cookie 设置脚本地址/foreach(array)self:$_coSitesInfoas$_siteInfo)$_code=self:authcode($_rawStr,ENCODE,$_siteInfokey);$_src=$_siteInfourl.?code=$_code.&time=.$_timestamp;$retscript.=urlencode();)/记住已登陆战/self:registerLoggedSite($siteFlag,$retsessID);unset($retuserinfosalt);)*用户不存在,或者被删除*密他错*未进行过单点登
15、陆处理$returnusername$returnpassword-1:-2:-3:string用户名string密他string$returnemail:Email2 .本站登陆成功后,进行本地化的用户登陆处理,其后验证用户是否登陆只在本地验证。(本地存取登陆用户状态的信息,请设置为关闭浏览器就退出)3 .当检测用户登陆状态时,请先调用本地的验证处理,若本地验证不通过,再调用UClientSSO:checkUserLogin()方法到用户中心检测用户的登陆状态。a)UClientSSO:checkUserLogin()方法如下:/*用户单点登陆验证函数*returnarray-integer
16、$returnstatus返回用户 ID,表示用户登录成功大于 0:*/publicstaticfunctioncheckUserLogin()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 二
17、 authcode($_COOKIE_UC_USER_COOKIE_NAME,DECODE,self 二$_authcodeKey);$username=$_userinfo0;$password=isset($_userinfo1)?$_userinfo1:;if(empty($password)$retstatus=-3;elsereturnself 二 loginSSO($username,$password,true,true);else$retstatus=-3;else/本站原先已经登陆过,通过保留的 sessonid 存根去用户中心验证/$_params=array(=$_ses
18、sId,=self 二$sitechecksum=md5($_sessIdself 二$_mcComunicationKey);$aRet=self 二_callSoap(getOnlineUser$_params);if(intval($aRetresultFlag)>0)/成功登陆$ret=$aRetuserinfo;else$retstatus=$aRetresultFlag;sessIdsiteFlagself 二$siteisset$userinfoif(isset($_userinfo=$_SESSIONself 二($_userinfopasswordusername$_u
19、cSessKey;)&&)&&b)用户验证中心的 webservice 服务程序,接收到检验登陆的请求后,调用UCenter:getOnlineUser()方法来处理登陆请求:/*根据 sid,获取当前登陆的用户信息*paramstring$sessId-全站唯sessionid ,用做 ticket*returnarray*/*根据 sid,获取当前登陆的用户信息*paramstring$sessId-全站唯sessionid ,用做 ticket*returnarray*/staticpublicfunctiongetOnlineUser($sessId,$
20、siteFlag)selfinit();session id(trim($sessId);sessionstart()$ret=array();通过 webservice请求注销掉用户的全站唯一标识*returninteger1:成功-11:验证码错误*/self:_getUserPassSalt($_userinfousername,$_userinfopassword)$retresultFlag=1;$retuserinfo=$_userinfo;self:registerLoggedSite($siteFlag,$sessId);/记住已登陆战unset($retuserinfosal
21、t);else$retresultFlag=0;return($ret);4.单点登出时,调用 UClientSSO:logoutSSO()方法。调用成功后,如需其他已登陆站立即登出,请调用UClientSSO:getSynloginScript()方法获取 W3C 标准的 script,在页面输出。a)UClientSSO:logoutSSO()方法如下:/*全站单点登出publicstaticfunctionlogoutSSO()self:_init();$_sessId=self:_getLocalSid();$aRet=self:_callSoap(logoutUCenter,$_pa
22、rams);if(intval($aRetresultFlag)>0)/成功登出self:_removeLocalSid();/移除本站记录的 sid 存根self:$_synlogoutScript=urldecode($aRetscript);$ret=1;else$ret=$aRetresultFlag;/本站没有登陆的话/if(empty($_sessId)self:_initSessreturnfalse;$_params=array(sessId=siteFlag=checksum=self:$_mcComunicationKey);不让同步登出其他站(true);$_ses
23、sId,self:$site,md5($_sessId.self:$site)returnintval($ret);b)用户验证中心的 webservice 服务程序,接收到全站登出请求后,调用 UCenter:loginUCenter()方法来处理登陆请求:/*登出全站处理* paramstring-全站唯sessionid,用做 ticket* returnboolean*/staticpublicfunctionlogoutUCenter($sessId)self 二_init();session_id(trim($sessId);session_start();$_SESSION=ar
24、ray();returnempty($_SESSION)?true:false四.代码部署:1 .用户验证中心设置a)用户验证中心向分站提供的 webservice 服务接口文件,即 UserSvc.php 部署在hostname/webapps/port/UserSvc.php 中。查看 wsdl 内容,请访问 https:/hostname/port/UserSvc.php?wsdlb)用户中心用户单点服务类文件为 UCenterSSO.class.php,文件路径为在hostname/webapps/include/UCenterSSO.class.php。该文件为用户单点登陆处理的服务
25、端类,被 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 脚本转移到此处,并编写进行本站登出的处理脚本。c)在子站点验
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 协议书和合同怎么查找
- 租地协议书合同
- 求兼职主播合同协议书
- 租房协议书没有合同
- 双人餐饮合同协议书
- 合同违约协议书范本
- 运费协议书合同
- 种植基地终止合同协议书
- 男女合同协议书
- 网络员考试题及答案
- 思想道德与法治教案第一章:领悟人生真谛把握人生方向
- 61850报文解析-深瑞版-131016
- 0-6岁儿童随访表
- 江西新定额2017土建定额说明及解释
- 国家电网有限公司十八项电网重大反事故措施(修订版)-2018版(word文档良心出品)
- 语文四年级下册《失落的一角》绘本阅读 课件(共61张PPT)
- 附件一∶ 教育部专家实地评估案头必备材料
- 余甘果的栽培与加工工艺
- 中考英语双向细目表
- (完整版)全usedtodo,beusedtodoing,beusedtodo辨析练习(带答案)
- 2002年湖北高考理科数学真题及答案
评论
0/150
提交评论