單點登錄,簡稱sso,是目前比較流行的企業業務整合的解決方案之一。定義是:在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。
實現原理:實現一次登錄一次退出,只需要想辦法讓各個sever的共用一個session的信息,讓客服端在各個域名下都能夠持有這個ID就好了。
實現方式:
server端: 1.共享cookie;2.驗證token;因為共享了cookie所以出于安全性考慮不再以session-id作為身份的識別。而是產生一個通用的識別標記,我們稱之為SSO-Token,這個識別標記在整個sever群中都是唯一的,它的背后代表的就是用戶的信息
瀏覽器端:在所有的業務域名下植入能夠代表身份的token,在統一個域名下很好實現,只需要將token存入cookie中就行了。但是有許多的公司其各個業務系統的域名都不相同,要在不同的域名下寫入cookie就需要用到跨域的技巧。
技術實現機制:
1.所有應用系統共享一個身份認證系統。
統一的認證系統是SSO的前提之一。認證系統的主要功能是將用戶的登錄信息和用戶信息庫相比較,對用戶進行登錄認證;認證成功后,認證系統應該生成統一的認證標志(ticket),返還給用戶。另外,認證系統還應該對token進行效驗,判斷其有效性。
1.所有應用系統能夠識別和提取token信息
要實現SSO的功能,讓用戶只登錄一次,就必須讓應用系統能夠識別已經登錄過的用戶。應用系統應該能對ticket進行識別和提取,通過與認證系統的通訊,能自動判斷當前用戶是否登錄過,從而完成單點登錄的功能。
優點:
1.提高用戶效率 ?2.提高開發效率 ?3.簡化管理
缺點:
1.不利于重構 2,,有可能導致安全信息的泄露
實現跨域:
本次項目中是使用的JQ+AJAX實現的跨域。
var url = domain.cdoArrDomain[i].strDomain + '?ticket=' + domain.ticket + '&sign=' + domain.sign;
$.ajax({
type: "get",
async: false,
url: url,
dataType: "jsonp",
jsonp: "callback",
success: function(json) {
console.log("success")
},
error: function(json) {
console.log(error)
}
});
需要注意的幾點是在填寫ajax的參數的時候,
dataType要設置為指定的jsonp;
url代表你想要跨域的地址;
jsonp是前后端約定好的回調函數 一般默認為callback;
需要注意的是在JQ提供的跨域功能中只支持用get的方式發送請求。因為jsonp跨域的原理是利用<script>標簽實現的,相當于是在新的域名下引入了一個<script>標簽,post方式不能夠實現這種需求;
一般來說,需要向多個域名下存入token,所以建議修改ajax的async屬性將其修改成為同步的。確保在每個域名下都寫入成功后再進行下面的操作。