单点登录
单点登录,简称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属性将其修改成为同步的。确保在每个域名下都写入成功后再进行下面的操作。