天天看點

PHP版單點登陸實作方案(原創by桂桂)

轉載自:http://www.guigui8.com/index.php/archives/34.html

http://hi.baidu.com/evangui/blog/item/0a10a10a23bc4936b1351d9a.html

摘要:

本文主要介紹了利用webservice,session,cookie技術,來進行通用的單點登入系統的分析與設計。具體實作語言為PHP。單點 登入,英文名為Single Sign On,簡稱為 SSO,是目前企業,網絡業務的使用者綜合處理的重要組成部分。而SSO的定義,是在多個應用系統中,使用者隻需要登陸一次就可以通路所有互相信任的應用系 統。

一.   登陸原理說明

單點登入的技術實作機制:當使用者第一次通路應用系統1的時候,因為還沒有登入,會被引導到認證系統中進行登入;根據使用者提供的登入資訊,認證系統進 行身份效驗,如果通過效驗,應該傳回給使用者一個認證的憑據--ticket;使用者再通路别的應用的時候,就會将這個ticket帶上,作為自己認證的憑 據,應用系統接受到請求之後會把ticket送到認證系統進行效驗,檢查ticket的合法性。如果通過效驗,使用者就可以在不用再次登入的情況下通路應用 系統2和應用系統3了。

可以看出,要實作SSO,需要以下主要的功能:

a) 所有應用系統共享一個身份認證系統;

b) 所有應用系統能夠識别和提取ticket資訊;

c) 應用系統能夠識别已經登入過的使用者,能自動判斷目前使用者是否登入過,進而完成單點登入的功能

基于以上基本原則,本人用php語言設計了一套單點登入系統的程式,目前已投入正式生成伺服器運作。本系統程式,将ticket資訊以全系統唯一的session id作為媒介,進而擷取目前線上使用者的全站資訊(登陸狀态資訊及其他需要處理的使用者全站資訊)。

二. 過程說明:

登陸流程:

1. 第一次登陸某個站:

a) 使用者輸入使用者名+密碼,向使用者驗證中心發送登入請求

b) 目前登入站點,通過webservice請求,使用者驗證中心驗證使用者名,密碼的合法性。如果驗證通過,則生成ticket,用于辨別目前會話的使用者,并将 目前登陸子站的站點辨別符記錄到使用者中心,最後c) 将擷取的使用者資料和ticket傳回給子站。如果驗證不通過,則傳回相應的錯誤狀态碼。

d) 根據上一步的webservice請求傳回的結果,目前子站對使用者進行登陸處理:如狀态碼表示成功的話,則目前站點通過本站cookie儲存ticket,并本站記錄使用者的登入狀态。狀态碼表示失敗的話,則給使用者相應的登入失敗提示。

2. 登陸狀态下,使用者轉到另一子:

a) 通過本站cookie或session驗證使用者的登入狀态:如驗證通過,進入正常本站處理程式;否則戶中心驗證使用者的登入狀态(發送ticket到使用者驗證中心),如驗證通過,則對傳回的使用者資訊進行本地的登入處理,否則表明使用者未登入。

登出流程

a) 目前登出站清除使用者本站的登入狀态 和 本地儲存的使用者全站唯一的随機id

b) 通過webservice接口,清除全站記錄的全站唯一的随機id。webservice接口會傳回,登出其他已登入子站的javascript代碼,本站輸出此代碼。

c) js代碼通路相應站W3C标準的登出腳本

三. 代碼說明:

本文所涉及到相關代碼,已打包上傳,如有興趣,可在本文最後下載下傳連結處點選下載下傳。

1. 登陸流程:

使用者從打開浏覽器開始,第一個登陸的子站點,必須調用UClientSSO::loginSSO()方法。該方法傳回全站唯一的随機id用于辨別該 使用者。該随機id在UClientSSO::loginSSO()中已認證本站cookie儲存,即該子站點保留了使用者已登陸辨別的存根于本站。

四. 代碼部署:

1. 使用者驗證中心設定

a) 使用者驗證中心向分站提供的webservice服務接口檔案,即UserSvc.php部署在hostname/webapps/port/ UserSvc.php中。檢視wsdl内容,請通路https://hostname/port/ UserSvc.php?wsdl

b) 使用者中心使用者單點服務類檔案為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腳本轉移到此處,并編寫進行本站登出的處理腳本。

c) 在子站點驗證使用者登陸狀态的代碼部分,額外增加到使用者中心的單點登陸驗證的處理。

即在首先通過本站驗證使用者的登陸狀态,如果未通過驗證,則去使用者中心驗證。驗證操作要調用UClientSSO::checkUserLogin();接口,接口含義請檢視代碼注釋。

d) 在分站的登出處理腳本中,通過UClientSSO::getSynlogoutScript();擷取script串輸出即可。

五. 擴充功能:

1. 記錄跟蹤所有線上使用者

因為所有使用者的登入都要經過使用者驗證中心,所有使用者的ticket都在驗證中心生成,可以将使用者和該ticket(session id)在記憶體表中建立一個映射表。得到所有線上使用者的記錄表。

後期如有必要跟蹤使用者狀态來實作其他功能,隻要跟蹤這個映射表就可以了。其他功能可以為: 擷取線上使用者清單,判斷使用者線上狀态,擷取線上使用者人數等。

2. 特殊統計處理

因為整個系統登入登出要經過使用者驗證中心,是以可以針對使用者的特殊統計進行處理。如使用者每天的登入次數,登陸時間,登陸狀态失效時間,各時段的線上使用者人數走勢等。

六. 其他事項:

1. 本站登陸狀态有效時間問題:

全站要求使用者登陸狀态在關閉浏覽器時就失效。要求各分站對session或cookie的處理方式按照如下進行:

a) Session方式記錄使用者登陸狀态的站點

請在站點公用腳本開始處,添加一下代碼

b) cookie方式記錄使用者登陸狀态的站點

請在設定使用者登陸狀态的cookie時,設定cookie有效時間為null.

2. 其他:

如有疑問,請直接聯系我:桂桂^_^

代碼下載下傳位址:使用者單點登陸相關代碼.zip

轉載于:https://www.cnblogs.com/l1b2q31/articles/2127784.html