摘要:
本文主要介紹了利用webservice,session,cookie技術,來進行通用的單點登錄系統的分析與設計。具體實現語言為PHP。單點
登錄,英文名為Single Sign On,簡稱為
SSO,是目前企業,網絡業務的用戶綜合處理的重要組成部分。而SSO的定義,是在多個應用系統中,用戶只需要登陸一次就可以訪問所有相互信任的應用系
統。
動機:
用過ucenter的全站登錄方式的朋友,應該都知道這是典型的觀察者模式的解決方案。用戶中心作為subject,
其所屬observer的注冊和刪除統一在ucenter的后臺進行。而各個子應用站點都對應一個observer。每次用戶中心的登錄動作,都會觸發
js腳本回調w3c標準的子站登錄接口(api/uc.php)。
這種方式的缺點,本人認為主要是兩點:1.
子站點過多時,回調接口相應增多,這個在分布子站的量的限制上,如何控制來使登錄效率不會太低,不好把握; 2.
當某個子站回調接口出現問題時,默認的登錄過程會卡住(可以限制登錄程序的執行時間,但相應出現問題子站后面的子站的回調接口就調不到了。
基于以上問題,在實際開發過程中,本人設計了另一套單點登錄系統。
一. 登陸原理說明
單點登錄的技術實現機制:當用戶第一次訪問應用系統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)
千鋒PHP通過本站cookie或session驗證用戶的登錄狀態:如驗證通過,進入正常本站處理程序;否則戶中心驗證用戶的登錄狀態(發送ticket到用戶驗證中心),如驗證通過,則對返回的用戶信息進行本地的登錄處理,否則表明用戶未登錄。
登出流程
a) 當前登出站清除用戶本站的登錄狀態 和 本地保存的用戶全站唯一的隨機id
b)
通過webservice接口,清除全站記錄的全站唯一的隨機id。webservice接口會返回,登出其他已登錄子站的javascript代碼,本站輸出此代碼。
c) js代碼訪問相應站W3C標準的登出腳本
三. 代碼說明:
本文所涉及到相關代碼,已打包上傳,如有興趣,可在本文最后下載鏈接處點擊下載。
1. 登陸流程:
用戶從打開瀏覽器開始,第一個登陸的子站點,必須調用UClientSSO::loginSSO()方法。該方法返回全站唯一的隨機id用于標識該用戶。該隨機id在UClientSSO::loginSSO()中已通過本站cookie保存,即該子站點保留了用戶已登陸標識的存根于本站。
a) UClientSSO::loginSSO()方法如下: