版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、PHP版單點登陸實現(xiàn)方案 摘要:本文主要介紹了利用webservice,session,cookie技術(shù),來進行通用的單點登錄系統(tǒng)的分析與設計。具體實現(xiàn)語言為PHP。單點登錄,英文名為Single Sign On,簡稱為 SSO,是目前企業(yè),網(wǎng)絡業(yè)務的用戶綜合處理的重要組成部分。而SSO的定義,是在多個應用系統(tǒng)中,用戶只需要登陸一次就可以訪問所有相互信任的應用系統(tǒng)。一. 登陸原理說明單點登錄的技術(shù)實現(xiàn)機制:當用戶第一次訪問應用系統(tǒng)1的時候,因為還沒有登錄,會被引導到認證系統(tǒng)中進行登錄;根據(jù)用戶提供的登錄信息,認證系統(tǒng)進行身份效驗,如果通過效驗,應該返回給用戶一個認證的憑
2、據(jù)ticket;用戶再訪問別的應用的時候,就會將這個ticket帶上,作為自己認證的憑據(jù),應用系統(tǒng)接受到請求之后會把ticket送到認證系統(tǒng)進行效驗,檢查ticket的合法性。如果通過效驗,用戶就可以在不用再次登錄的情況下訪問應用系統(tǒng)2和應用系統(tǒng)3了??梢钥闯?,要實現(xiàn)SSO,需要以下主要的功能:a) 所有應用系統(tǒng)共享一個身份認證系統(tǒng);b) 所有應用系統(tǒng)能夠識別和提取ticket信息;c) 應用系統(tǒng)能夠識別已經(jīng)登錄過的用戶,能自動判斷當前用戶是否登錄過,從而完成單點登錄的功能基于以上基本原則,本人用php語言設計了一套單點登錄系統(tǒng)的程序,目前已投入正式生成服務器運行。本系統(tǒng)程序,將ticket信
3、息以全系統(tǒng)唯一的session id作為媒介,從而獲取當前在線用戶的全站信息(登陸狀態(tài)信息及其他需要處理的用戶全站信息)。二. 過程說明:登陸流程:1. 第一次登陸某個站:a) 用戶輸入用戶名+密碼,向用戶驗證中心發(fā)送登錄請求b) 當前登錄站點,通過webservice請求,用戶驗證中心驗證用戶名,密碼的合法性。如果驗證通過,則生成ticket,用于標識當前會話的用戶,并將當前登陸子站的站點標識符記錄到用戶中心,最后c) 將獲取的用戶數(shù)據(jù)和ticket返回給子站。如果驗證不通過,則返回相應的錯誤狀態(tài)碼。d) 根據(jù)上一步的webservice請求返回的結(jié)果,當前子站對用戶進行登陸處理:如狀態(tài)碼表
4、示成功的話,則當前站點通過本站cookie保存ticket,并本站記錄用戶的登錄狀態(tài)。狀態(tài)碼表示失敗的話,則給用戶相應的登錄失敗提示。2. 登陸狀態(tài)下,用戶轉(zhuǎn)到另一子:a) 通過本站cookie或session驗證用戶的登錄狀態(tài):如驗證通過,進入正常本站處理程序;否則戶中心驗證用戶的登錄狀態(tài)(發(fā)送ticket到用戶驗證中心),如驗證通過,則對返回的用戶信息進行本地的登錄處理,否則表明用戶未登錄。登出流程a) 當前登出站清除用戶本站的登錄狀態(tài) 和 本地保存的用戶全站唯一的隨機idb) 通過webservice接口,清除全站記錄的全站唯一的隨機id。webservice接口會返回,登出其他已登錄子
5、站的javascript代碼,本站輸出此代碼。c) js代碼訪問相應站W(wǎng)3C標準的登出腳本用戶單點登陸示意圖三. 代碼說明:本文所涉及到相關(guān)代碼,已打包上傳,如有興趣,可在本文最后下載鏈接處點擊下載。1. 登陸流程:用戶從打開瀏覽器開始,第一個登陸的子站點,必須調(diào)用UClientSSO:loginSSO()方法。該方法返回全站唯一的隨機id用于標識該用戶。該隨機id在UClientSSO:loginSSO()中已通過本站cookie保存,即該子站點保留了用戶已登陸標識的存根于本站。a) UClientSSO:loginSSO()方法如下:/* * 用戶驗證中心 登陸用戶處理 * * param
6、 string $username - 用戶名 * param string $password - 用戶原始密碼 * param boolean $remember - 是否永久記住登陸賬號 * param boolean $alreadyEnc - 傳入的密碼是否已經(jīng)經(jīng)過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接口的參數(shù)/$_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.調(diào)用webservice接口,進行登陸處理/$aRet = self:_callSoap('loginUCenter', $_params); if (intval($aRet'resultFlag') > 0 && $aRet'sessID') /成功登陸/設置本地session i
10、dself:_setLocalSid($aRet'sessID'); /設置用戶中心的統(tǒng)一session id腳本路徑self:$_synloginScript = urldecode($aRet'script'); $ret = $aRet'userinfo' else $ret'status' = $aRet'resultFlag' return $ret;/end of functionb) 用戶驗證中心的webservice服務程序,接收到登陸驗證請求后,調(diào)用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全站通行 /合作中心站回調(diào)登陸接口(設置用戶中心的統(tǒng)一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>'); / 記住已登陸戰(zhàn)/self:registerLoggedSite($siteFlag, $ret'sessID'); unset($ret'userinfo'
17、'salt'); return $ret;2. 本站登陸成功后,進行本地化的用戶登陸處理,其后驗證用戶是否登陸只在本地驗證。(本地存取登陸用戶狀態(tài)的信息,請設置為關(guān)閉瀏覽器就退出)3. 當檢測用戶登陸狀態(tài)時,請先調(diào)用本地的驗證處理,若本地驗證不通過,再調(diào)用UClientSSO:checkUserLogin()方法到用戶中心檢測用戶的登陸狀態(tài)。a) UClientSSO:checkUserLogin()方法如下:/* * 用戶單點登陸驗證函數(shù) * * 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) / 根據(jù)cookie里的用戶名和密碼判斷用戶是否已經(jīng)登陸。/$_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 /本站原先已經(jīng)登陸過,通過保留的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服務程序,接收到檢驗登陸的請求后,調(diào)用UCenter:getOnlineUser()方法來處理登陸請求:/* * 根據(jù)sid,獲取當前登陸的用戶信息 * * param string $sessId- 全站唯一session id,用做ticket * return array */* * 根據(jù)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);/記住已登陸戰(zhàn)unset($ret'userinfo''salt'); else $ret'resultFlag' = "0" return ($ret)
25、;4. 單點登出時,調(diào)用UClientSSO:logoutSSO()方法。調(diào)用成功后,如需其他已登陸站立即登出,請調(diào)用 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服務程序,接收到全站登出請求后,調(diào)用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內(nèi)容,請訪問 UserSvc.php?wsdlb) 用戶中心用戶單點服務類文件為UCenterSSO.class.php,文件路徑為在hostname/webapps/include/UCenterSSO.class.php。該文件為用戶單點登陸處理 的服務端類,被hostname/webapps/port/ UserSvc.php調(diào)用。用于獲取用戶的登陸信息,是否單點登陸的狀態(tài)信息,單點登出處理等。c) 用戶驗證中心通過W3C標準,利用cookie方式記錄,刪除全站統(tǒng)一的用戶唯一隨機id 的腳本文件為hostname/webapps/port/cookie_mgr.php.2. 子站點設置a) 各子站點請將,UClientSSO.class.php部署在用戶中心服務客戶端目錄下。部署好后,請修改最后一行的UClientSSO:setSite(1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年西安高新區(qū)第五學校校園招聘備考題庫及參考答案詳解1套
- 2026年扶余市事業(yè)單位公開選拔招聘工作人員備考題庫(35人)及一套參考答案詳解
- 2025河北興冀人才資源開發(fā)有限公司招聘護理助理90人備考題庫及答案詳解1套
- 2025陜西西安市高陵區(qū)農(nóng)業(yè)技術(shù)推廣中心招募基層農(nóng)技推廣體系改革與建設項目特聘農(nóng)技員10人備考題庫及一套答案詳解
- 2026安徽池州市東至縣機關(guān)事務服務中心招聘司勤人員3人備考題庫及參考答案詳解一套
- 2026暨南大學附屬第一醫(yī)院粵西醫(yī)院(陽西總醫(yī)院)就業(yè)見習崗位74人備考題庫(廣東)及答案詳解(易錯題)
- 2025湖南省演出公司公開招聘2人備考題庫及完整答案詳解1套
- 2025天津津彩投資公司面向社會選聘1人備考題庫(第25期)及答案詳解(奪冠系列)
- 2025河北唐山一中教育集團金楓葉學校招聘教師1人備考題庫完整參考答案詳解
- 2025上海對外經(jīng)貿(mào)大學實驗中心信息管理人員招聘1人備考題庫及答案詳解(新)
- 征信修復合同范本
- 2025年公安部遴選面試題及答案
- 中煤集團機電裝備部副部長管理能力考試題集含答案
- 化工廠設備維護保養(yǎng)培訓
- 福建省網(wǎng)絡安全事件應急預案
- 五育融合課件
- 意識障礙的判斷及護理
- 儲能電站安全管理與操作規(guī)程
- 2025年宿遷市泗陽縣保安員招聘考試題庫附答案解析
- 交通安全企業(yè)培訓課件
- 2025年廣東省中考物理試卷及答案
評論
0/150
提交評論