PHP版單點(diǎn)登陸實現(xiàn)方案_第1頁
PHP版單點(diǎn)登陸實現(xiàn)方案_第2頁
PHP版單點(diǎn)登陸實現(xiàn)方案_第3頁
PHP版單點(diǎn)登陸實現(xiàn)方案_第4頁
PHP版單點(diǎn)登陸實現(xiàn)方案_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、PHP版單點(diǎn)登陸實現(xiàn)方案 摘要:本文主要介紹了利用webservice,session,cookie技術(shù),來進(jìn)行通用的單點(diǎn)登錄系統(tǒng)的分析與設(shè)計。具體實現(xiàn)語言為PHP。單點(diǎn)登錄,英文名為Single Sign On,簡稱為 SSO,是目前企業(yè),網(wǎng)絡(luò)業(yè)務(wù)的用戶綜合處理的重要組成部分。而SSO的定義,是在多個應(yīng)用系統(tǒng)中,用戶只需要登陸一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)。一. 登陸原理說明單點(diǎn)登錄的技術(shù)實現(xiàn)機(jī)制:當(dāng)用戶第一次訪問應(yīng)用系統(tǒng)1的時候,因為還沒有登錄,會被引導(dǎo)到認(rèn)證系統(tǒng)中進(jìn)行登錄;根據(jù)用戶提供的登錄信息,認(rèn)證系統(tǒng)進(jìn)行身份效驗,如果通過效驗,應(yīng)該返回給用戶一個認(rèn)證的憑據(jù)ticket;用戶再訪

2、問別的應(yīng)用的時候,就會將這個ticket帶上,作為自己認(rèn)證的憑據(jù),應(yīng)用系統(tǒng)接受到請求之后會把ticket送到認(rèn)證系統(tǒng)進(jìn)行效驗,檢查ticket的合法性。如果通過效驗,用戶就可以在不用再次登錄的情況下訪問應(yīng)用系統(tǒng)2和應(yīng)用系統(tǒng)3了??梢钥闯?,要實現(xiàn)SSO,需要以下主要的功能:a) 所有應(yīng)用系統(tǒng)共享一個身份認(rèn)證系統(tǒng);b) 所有應(yīng)用系統(tǒng)能夠識別和提取ticket信息;c) 應(yīng)用系統(tǒng)能夠識別已經(jīng)登錄過的用戶,能自動判斷當(dāng)前用戶是否登錄過,從而完成單點(diǎn)登錄的功能基于以上基本原則,本人用php語言設(shè)計了一套單點(diǎn)登錄系統(tǒng)的程序,目前已投入正式生成服務(wù)器運(yùn)行。本系統(tǒng)程序,將ticket信息以全系統(tǒng)唯一的sess

3、ion id作為媒介,從而獲取當(dāng)前在線用戶的全站信息(登陸狀態(tài)信息及其他需要處理的用戶全站信息)。二. 過程說明:登陸流程:1. 第一次登陸某個站:a) 用戶輸入用戶名+密碼,向用戶驗證中心發(fā)送登錄請求b) 當(dāng)前登錄站點(diǎn),通過webservice請求,用戶驗證中心驗證用戶名,密碼的合法性。如果驗證通過,則生成ticket,用于標(biāo)識當(dāng)前會話的用戶,并將當(dāng)前登陸子站的站點(diǎn)標(biāo)識符記錄到用戶中心,最后c) 將獲取的用戶數(shù)據(jù)和ticket返回給子站。如果驗證不通過,則返回相應(yīng)的錯誤狀態(tài)碼。d) 根據(jù)上一步的webservice請求返回的結(jié)果,當(dāng)前子站對用戶進(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驗證用戶的登錄狀態(tài):如驗證通過,進(jìn)入正常本站處理程序;否則戶中心驗證用戶的登錄狀態(tài)(發(fā)送ticket到用戶驗證中心),如驗證通過,則對返回的用戶信息進(jìn)行本地的登錄處理,否則表明用戶未登錄。登出流程a) 當(dāng)前登出站清除用戶本站的登錄狀態(tài) 和 本地保存的用戶全站唯一的隨機(jī)idb) 通過webservice接口,清除全站記錄的全站唯一的隨機(jī)id。webservice接口會返回,登出其他已登錄子站的javascript

5、代碼,本站輸出此代碼。c) js代碼訪問相應(yīng)站W(wǎng)3C標(biāo)準(zhǔn)的登出腳本用戶單點(diǎn)登陸示意圖三. 代碼說明:本文所涉及到相關(guān)代碼,已打包上傳,如有興趣,可在本文最后下載鏈接處點(diǎn)擊下載。1. 登陸流程:用戶從打開瀏覽器開始,第一個登陸的子站點(diǎn),必須調(diào)用UClientSSO:loginSSO()方法。該方法返回全站唯一的隨機(jī)id用于標(biāo)識該用戶。該隨機(jī)id在UClientSSO:loginSSO()中已通過本站cookie保存,即該子站點(diǎn)保留了用戶已登陸標(biāo)識的存根于本站。a) UClientSSO:loginSSO()方法如下:/* * 用戶驗證中心 登陸用戶處理 * * param string $use

6、rname - 用戶名 * param string $password - 用戶原始密碼 * param boolean $remember - 是否永久記住登陸賬號 * param boolean $alreadyEnc - 傳入的密碼是否已經(jīng)經(jīng)過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接口的參數(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) 用戶驗證中心的webservice服務(wù)程序,接收到登陸驗證請求后,調(diào)用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全站通行/合作中心站回調(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)行本地化的用戶登陸處理,其后驗證用戶是否登陸只在本地驗證。(本地存取登陸用戶狀態(tài)的信息,請設(shè)置為關(guān)閉瀏覽器就退出)3. 當(dāng)檢測用戶登陸狀態(tài)時,請先調(diào)用本地的驗證處理,若本地驗證不通過,再調(diào)用UClientSSO:checkUserLogin()方法到用戶中心檢測用戶的登陸狀態(tài)。a) UC

15、lientSSO:checkUserLogin()方法如下:/* * 用戶單點(diǎn)登陸驗證函數(shù) * * return array - integer $returnstatus 大于 0:返回用戶 ID,表示用戶登錄成功 * 0:用戶沒有在全站登陸 * -1:用戶不存在,或者被刪除 * -2:密碼錯 * -3:未進(jìn)行過單點(diǎn)登陸處理 * -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) / 根據(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存根去用戶中心驗證/$_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服務(wù)程序,接收到檢驗登陸的請求后,調(diào)用UCenter:getOnlineUser()方法來處理登陸請求:/* *

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)登出時,調(diào)用UClientSSO:logoutSSO()方法。調(diào)用成功后,如需其他已登陸站立即登出,請調(diào)用 UClientSSO:getSynloginScript()方法獲取W3C標(biāo)準(zhǔn)的script,在頁面輸出。a) UClientSSO:logoutSSO()方法如下:/* * 全站單點(diǎn)登出 * - 通過webservice請求注銷掉用戶的全站唯一標(biāo)識 * * 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服務(wù)程序,接收到全站登出請求后,調(diào)用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. 用戶驗證中心設(shè)置a) 用戶驗證中心向分站提供的webservice服務(wù)接口文件,即UserSvc.php部署在hostname/webapps/port/ UserSvc.php中。查看wsdl內(nèi)容,請訪問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) 用戶驗證中心通過W3C標(biāo)準(zhǔn),利用cookie方式記錄,刪除全站統(tǒng)一的用戶唯一隨機(jī)id 的腳本文件為hostname/webapps/port/cookie_mgr.php.2. 子站點(diǎn)設(shè)置a) 各子站點(diǎn)請將,UClientSSO.class.php部署在用戶中心服務(wù)客戶端目錄下。部署好后,請修改最后一行的UClientSSO:setSite(1); 參數(shù)值為用戶驗證中心統(tǒng)一分配給各站的標(biāo)識id.b) 在部署的用戶中心服務(wù)客戶端包下的api目錄下下,請將logout_sso.php腳本轉(zhuǎn)移到此處,并編寫進(jìn)行本

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論