




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、PHP版單點(diǎn)登陸實(shí)現(xiàn)方案 摘要:本文主要介紹了利用webservice,session,cookie技術(shù),來進(jìn)行通用的單點(diǎn)登錄系統(tǒng)的分析與設(shè)計(jì)。具體實(shí)現(xiàn)語言為PHP。單點(diǎn)登錄,英文名為Single Sign On,簡(jiǎn)稱為 SSO,是目前企業(yè),網(wǎng)絡(luò)業(yè)務(wù)的用戶綜合處理的重要組成部分。而SSO的定義,是在多個(gè)應(yīng)用系統(tǒng)中,用戶只需要登陸一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)。一. 登陸原理說明單點(diǎn)登錄的技術(shù)實(shí)現(xiàn)機(jī)制:當(dāng)用戶第一次訪問應(yīng)用系統(tǒng)1的時(shí)候,因?yàn)檫€沒有登錄,會(huì)被引導(dǎo)到認(rèn)證系統(tǒng)中進(jìn)行登錄;根據(jù)用戶提供的登錄信息,認(rèn)證系統(tǒng)進(jìn)行身份效驗(yàn),如果通過效驗(yàn),應(yīng)該返回給用戶一個(gè)認(rèn)證的憑據(jù)ticket;用戶再訪
2、問別的應(yīng)用的時(shí)候,就會(huì)將這個(gè)ticket帶上,作為自己認(rèn)證的憑據(jù),應(yīng)用系統(tǒng)接受到請(qǐng)求之后會(huì)把ticket送到認(rèn)證系統(tǒng)進(jìn)行效驗(yàn),檢查ticket的合法性。如果通過效驗(yàn),用戶就可以在不用再次登錄的情況下訪問應(yīng)用系統(tǒng)2和應(yīng)用系統(tǒng)3了??梢钥闯觯獙?shí)現(xiàn)SSO,需要以下主要的功能:a) 所有應(yīng)用系統(tǒng)共享一個(gè)身份認(rèn)證系統(tǒng);b) 所有應(yīng)用系統(tǒng)能夠識(shí)別和提取ticket信息;c) 應(yīng)用系統(tǒng)能夠識(shí)別已經(jīng)登錄過的用戶,能自動(dòng)判斷當(dāng)前用戶是否登錄過,從而完成單點(diǎn)登錄的功能基于以上基本原則,本人用php語言設(shè)計(jì)了一套單點(diǎn)登錄系統(tǒng)的程序,目前已投入正式生成服務(wù)器運(yùn)行。本系統(tǒng)程序,將ticket信息以全系統(tǒng)唯一的sess
3、ion id作為媒介,從而獲取當(dāng)前在線用戶的全站信息(登陸狀態(tài)信息及其他需要處理的用戶全站信息)。二. 過程說明:登陸流程:1. 第一次登陸某個(gè)站:a) 用戶輸入用戶名+密碼,向用戶驗(yàn)證中心發(fā)送登錄請(qǐng)求b) 當(dāng)前登錄站點(diǎn),通過webservice請(qǐng)求,用戶驗(yàn)證中心驗(yàn)證用戶名,密碼的合法性。如果驗(yàn)證通過,則生成ticket,用于標(biāo)識(shí)當(dāng)前會(huì)話的用戶,并將當(dāng)前登陸子站的站點(diǎn)標(biāo)識(shí)符記錄到用戶中心,最后c) 將獲取的用戶數(shù)據(jù)和ticket返回給子站。如果驗(yàn)證不通過,則返回相應(yīng)的錯(cuò)誤狀態(tài)碼。d) 根據(jù)上一步的webservice請(qǐng)求返回的結(jié)果,當(dāng)前子站對(duì)用戶進(jìn)行登陸處理:如狀態(tài)碼表示成功的話,則當(dāng)前站點(diǎn)通
4、過本站cookie保存ticket,并本站記錄用戶的登錄狀態(tài)。狀態(tài)碼表示失敗的話,則給用戶相應(yīng)的登錄失敗提示。2. 登陸狀態(tài)下,用戶轉(zhuǎn)到另一子:a) 通過本站cookie或session驗(yàn)證用戶的登錄狀態(tài):如驗(yàn)證通過,進(jìn)入正常本站處理程序;否則戶中心驗(yàn)證用戶的登錄狀態(tài)(發(fā)送ticket到用戶驗(yàn)證中心),如驗(yàn)證通過,則對(duì)返回的用戶信息進(jìn)行本地的登錄處理,否則表明用戶未登錄。登出流程a) 當(dāng)前登出站清除用戶本站的登錄狀態(tài) 和 本地保存的用戶全站唯一的隨機(jī)idb) 通過webservice接口,清除全站記錄的全站唯一的隨機(jī)id。webservice接口會(huì)返回,登出其他已登錄子站的javascript
5、代碼,本站輸出此代碼。c) js代碼訪問相應(yīng)站W(wǎng)3C標(biāo)準(zhǔn)的登出腳本用戶單點(diǎn)登陸示意圖三. 代碼說明:本文所涉及到相關(guān)代碼,已打包上傳,如有興趣,可在本文最后下載鏈接處點(diǎn)擊下載。1. 登陸流程:用戶從打開瀏覽器開始,第一個(gè)登陸的子站點(diǎn),必須調(diào)用UClientSSO:loginSSO()方法。該方法返回全站唯一的隨機(jī)id用于標(biāo)識(shí)該用戶。該隨機(jī)id在UClientSSO:loginSSO()中已通過本站cookie保存,即該子站點(diǎn)保留了用戶已登陸標(biāo)識(shí)的存根于本站。a) UClientSSO:loginSSO()方法如下:/* * 用戶驗(yàn)證中心 登陸用戶處理 * * param string $use
6、rname - 用戶名 * param string $password - 用戶原始密碼 * param boolean $remember - 是否永久記住登陸賬號(hào) * param boolean $alreadyEnc - 傳入的密碼是否已經(jīng)經(jīng)過simpleEncPass加密過 * * return array - integer $returnstatus 大于 0:返回用戶 ID,表示用戶登錄成功 * -1:用戶不存在,或者被刪除 * -2:密碼錯(cuò) * -11:驗(yàn)證碼錯(cuò)誤 * 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接口的參數(shù)/$_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.調(diào)用webservice接口,進(jìn)行登陸處理/$aRet = self:_callSoap(loginUCenter, $_params);if (intval($aRetresu
9、ltFlag) > 0 && $aRetsessID) /成功登陸/設(shè)置本地session idself:_setLocalSid($aRetsessID);/設(shè)置用戶中心的統(tǒng)一session id腳本路徑self:$_synloginScript = urldecode($aRetscript);$ret = $aRetuserinfo; else $retstatus = $aRetresultFlag;return $ret;/end of functionb) 用戶驗(yàn)證中心的webservice服務(wù)程序,接收到登陸驗(yàn)證請(qǐng)求后,調(diào)用UCenter:loginUCen
10、ter()方法來處理登陸請(qǐng)求。/* * 用戶驗(yàn)證中心 登陸用戶處理 * * 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全站通行/合作中心站回調(diào)登陸接口(設(shè)置用戶中心的統(tǒng)一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);/ 合作站點(diǎn)的全域cookie設(shè)置腳本地址/foreach (array)self:$_coSitesInfo as $_siteInfo) $_code = self:authcode($_rawStr, ENCODE, $_siteInfokey);$_src = $_siteInfourl . ?code= . $_code .
14、 &time= . $_timestamp;$retscript .= urlencode();/ 記住已登陸戰(zhàn)/self:registerLoggedSite($siteFlag, $retsessID);unset($retuserinfosalt);return $ret;2. 本站登陸成功后,進(jìn)行本地化的用戶登陸處理,其后驗(yàn)證用戶是否登陸只在本地驗(yàn)證。(本地存取登陸用戶狀態(tài)的信息,請(qǐng)?jiān)O(shè)置為關(guān)閉瀏覽器就退出)3. 當(dāng)檢測(cè)用戶登陸狀態(tài)時(shí),請(qǐng)先調(diào)用本地的驗(yàn)證處理,若本地驗(yàn)證不通過,再調(diào)用UClientSSO:checkUserLogin()方法到用戶中心檢測(cè)用戶的登陸狀態(tài)。a) UC
15、lientSSO:checkUserLogin()方法如下:/* * 用戶單點(diǎn)登陸驗(yàn)證函數(shù) * * return array - integer $returnstatus 大于 0:返回用戶 ID,表示用戶登錄成功 * 0:用戶沒有在全站登陸 * -1:用戶不存在,或者被刪除 * -2:密碼錯(cuò) * -3:未進(jìn)行過單點(diǎn)登陸處理 * -11:驗(yàn)證碼錯(cuò)誤 * string $returnusername : 用戶名 * string $returnpassword : 密碼 * string $returnemail : Email */public static function checkUs
16、erLogin()self:_init();$ret = array();$_sessId = self:_getLocalSid();if (empty($_sessId) /永久記住賬號(hào)處理if(isset($_COOKIE_UC_USER_COOKIE_NAME) && !empty($_COOKIE_UC_USER_COOKIE_NAME) / 根據(jù)cookie里的用戶名和密碼判斷用戶是否已經(jīng)登陸。/$_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 /本站原先已經(jīng)登陸過,通過保留的sesson id存根去用戶中心驗(yàn)證/$_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) 用戶驗(yàn)證中心的webservice服務(wù)程序,接收到檢驗(yàn)登陸的請(qǐng)求后,調(diào)用UCenter:getOnlineUser()方法來處理登陸請(qǐng)求:/* *
19、 根據(jù)sid,獲取當(dāng)前登陸的用戶信息 * * param string $sessId- 全站唯一session id,用做ticket * return array */* * 根據(jù)sid,獲取當(dāng)前登陸的用戶信息 * * 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);/記住已登陸戰(zhàn)unset($retuserinfosalt);
21、else $retresultFlag = 0;return ($ret);4. 單點(diǎn)登出時(shí),調(diào)用UClientSSO:logoutSSO()方法。調(diào)用成功后,如需其他已登陸站立即登出,請(qǐng)調(diào)用 UClientSSO:getSynloginScript()方法獲取W3C標(biāo)準(zhǔn)的script,在頁面輸出。a) UClientSSO:logoutSSO()方法如下:/* * 全站單點(diǎn)登出 * - 通過webservice請(qǐng)求注銷掉用戶的全站唯一標(biāo)識(shí) * * return integer 1: 成功 * -11:驗(yàn)證碼錯(cuò)誤 */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) 用戶驗(yàn)證中心的webservice服務(wù)程序,接收到全站登出請(qǐng)求后,調(diào)用UCenter:loginUCenter()方法來處理登陸請(qǐng)求:/* * 登出全站處理 * * 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. 用戶驗(yàn)證中心設(shè)置a) 用戶驗(yàn)證中心向分站提供的webservice服務(wù)接口文件,即UserSvc.php部署在hostname/webapps/port/ UserSvc.php中。查看wsdl內(nèi)容,請(qǐng)?jiān)L問https:/hostname/
25、port/ UserSvc.php?wsdlb) 用戶中心用戶單點(diǎn)服務(wù)類文件為UCenterSSO.class.php,文件路徑為在hostname/webapps/include/UCenterSSO.class.php。該文件為用戶單點(diǎn)登陸處理 的服務(wù)端類,被hostname/webapps/port/ UserSvc.php調(diào)用。用于獲取用戶的登陸信息,是否單點(diǎn)登陸的狀態(tài)信息,單點(diǎn)登出處理等。c) 用戶驗(yàn)證中心通過W3C標(biāo)準(zhǔn),利用cookie方式記錄,刪除全站統(tǒng)一的用戶唯一隨機(jī)id 的腳本文件為hostname/webapps/port/cookie_mgr.php.2. 子站點(diǎn)設(shè)置a) 各子站點(diǎn)請(qǐng)將,UClientSSO.class.php部署在用戶中心服務(wù)客戶端目錄下。部署好后,請(qǐng)修改最后一行的UClientSSO:setSite(1); 參數(shù)值為用戶驗(yàn)證中心統(tǒng)一分配給各站的標(biāo)識(shí)id.b) 在部署的用戶中心服務(wù)客戶端包下的api目錄下下,請(qǐng)將logout_sso.php腳本轉(zhuǎn)移到此處,并編寫進(jìn)行本
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)民工勞務(wù)合同書
- 踢腳施工方案
- 旅游規(guī)劃與旅游資源開發(fā)知識(shí)點(diǎn)梳理
- 建筑施工技術(shù)與管理規(guī)范手冊(cè)
- 金華型鋼加固施工方案
- 農(nóng)業(yè)產(chǎn)量與價(jià)格趨勢(shì)表
- 臺(tái)階施工方案
- 鄭州水上打樁施工方案
- 隧道混凝土施工方案
- 基坑支護(hù)錨索施工方案
- 公司安全事故隱患內(nèi)部舉報(bào)、報(bào)告獎(jiǎng)勵(lì)制度
- 產(chǎn)品方案設(shè)計(jì)模板
- 部隊(duì)通訊員培訓(xùn)
- 《市值管理探究的國內(nèi)外文獻(xiàn)綜述》4000字
- 2024-2030年中國企業(yè)在安哥拉投資建設(shè)化肥廠行業(yè)供需狀況及發(fā)展風(fēng)險(xiǎn)研究報(bào)告版
- 物業(yè)公司水浸、水管爆裂事故應(yīng)急處置預(yù)案
- 河南省公務(wù)員面試真題匯編7
- 高管履歷核實(shí)調(diào)查報(bào)告
- SF-T0095-2021人身損害與疾病因果關(guān)系判定指南
- 2024并網(wǎng)光伏逆變器技術(shù)規(guī)范
- 制作塔臺(tái)模型課件科學(xué)六年級(jí)下冊(cè)教科版
評(píng)論
0/150
提交評(píng)論