单点登录概念
在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。
如图上所示,图中有四个系统,分别是Application1、Application2、Application3和SSO。只有SSO有登录模块没有其他业务模块,其他三个系统都没有登录模块,当没有登录模块需要登录时,将跳到SSO系统,SSO系统完成登录,其他的应用系统也随之登录了。这就完全符合了对单点登录的定义。
登录认证机制
如图所示,我们在浏览器中访问一个应用,这个应用需要登录,我们填写完用户名和密码后,完成登录认证。这时,我们在这个用户的session中标记登录状态为yes(已登录),同时在浏览器中写入cookie,这个cookie是这个用户的唯一标识。下次我们再访问这个应用的时候,请求中会带上这个cookie,服务端会根据这个cookie找到相对应的session,通过session来判断这个用户是否登录。
同域下的单点登录
一个企业一般情况下只有一个域名,通过二级域名区分不同的系统。比如我们有个域名叫做:z.com,同时有两个业务系统分别为:app1.z.com和app2.z.com。我们要做单点登录(SSO),需要一个登录系统,叫做:sso.z.com。
我们只要在sso.z.com登录,app1.z.com和app2.z.com就也登录了。通过上面的登陆认证机制,我们可以知道,在sso.z.com中登录了,其实是在sso.z.com的服务端的session中记录了登录状态,同时在浏览器端(Browser)的sso.z.com下写入了Cookie。那么我们怎么才能让app1.z.com和app2.z.com登录呢?这里有两个问题:
1.cookie是不能跨域的,我们cookie的domain属性是sso.a.com,在给app1.z.com 和app2.z.com发送请求是带不上的。
2.sso、app1和app2是不同的应用,它们的session存在自己的应用类,是不共享的。
问题解决方法
针对第一个问题,sso登录以后,可以将cookie的域设置为顶域,即.z.com,这样所有子域的系统都可以访问到顶域的cookie。在设置cookie时,只能设置顶域和自己的域,不能设置其他的域。
针对第二个问题,就是要把三个系统的session共享。如下图所示:
但是这还不是真正的单点登录,只是实现了同域下的单点登录。
不同域下的单点登录
CAS流程
CAS流程是单点登录的标准流程:
1.用户访问app系统,app系统是需要登录的,但用户现在没有登录。
2.跳转到CAS server,也就是SSO登录系统,SSO系统也没有登录,弹出用户登录页。
3.用户填写用户名和密码,SSO系统进行认证后,将登录状态写入session,浏览器中写入sso域下的cookie。
4.sso系统登录完成后会生产一个ST(service ticket),然后跳转到app系统,同时将ST作为参数传递给app系统。
5.app系统拿到ST后,从后台向sso发送请求,验证ST是否有效。
6.验证通过后,app系统将登录状态写入session并设置app域下的cookie。
总结
-
单点登录(SSO系统)是保障各业务系统的用户资源的安全 。
-
各个业务系统获得的信息是,这个用户能不能访问我的资源。
-
单点登录,资源都在各个业务系统这边,不在SSO那一方。 用户在给SSO服务器提供了用户名密码后,作为业务系统并不知道这件事。 SSO随便给业务系统一个ST,那么业务系统是不能确定这个ST是用户伪造的,还是真的有效,所以要拿着这个ST去SSO服务器再问一下,这个用户给我的ST是否有效,是有效的我才能让这个用户访问。