单点登录说明
单点登录的英文名叫做:Single Sign On(简称SSO)。一般应用于多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的保护资源。如登录访问 www.abc.com 后,对于www.efg.com 也是登录访问。 比如阿里系的淘宝和天猫,很明显地我们可以知道这是两个系统,但是你在使用的时候,登录了天猫,淘宝也会自动登录。 以下实现基于cookie等认证,对于cookie的原理不做详细说明,可以单独了解。
主域名相同:
如果公司内的所有业务都共享到 xxx.com 一个主域名下,则可以将 Token 的 Cookie 种到 xxx.com 这个根域名下,这样在任一系统登录后,在访问其他业务系统就不需要重新登录了,因为其他业务系统也是 xxx.com后缀,浏览器会把根域名的 Cookie 带到每个请求中,即可实现单点登录功能。
这个方案的优点是实现简单,前端的接入成本更低,但是有以下几个缺点: 1、限制了业务系统使用域名的自由,在跨三方时几乎是不可行的。 2、Token 种到根域名下,能访问所有业务的资源,无法做到 Token 的隔离。
多域名系统:
当各系统使用不同域名时,一般采用CAS方案,下面详细说明一下CAS原理。
如果已经将登录单独抽取成系统出来,我们还能这样玩。现在我们有两个系统,分别是www.java3y.com和www.java4y.com,一个SSOwww.sso.com
首先,用户想要访问系统Awww.java3y.com受限的资源(比如说购物车功能,购物车功能需要登录后才能访问),系统Awww.java3y.com发现用户并没有登录,于是重定向到sso认证中心,并将自己的地址作为参数。请求的地址如下:
www.sso.com?service=www.java3y.com sso认证中心发现用户未登录,将用户引导至登录页面,用户进行输入用户名和密码进行登录,用户与认证中心建立全局会话(生成一份Token,写到Cookie中,保存在浏览器上)
随后,认证中心重定向回系统A,并把Token携带过去给系统A,重定向的地址如下:
www.java3y.com?token=xxxxxxx 接着,系统A去sso认证中心验证这个Token是否正确,如果正确,则系统A和用户建立局部会话(创建Session)。到此,系统A和用户已经是登录状态了。
此时,用户想要访问系统Bwww.java4y.com受限的资源(比如说订单功能,订单功能需要登录后才能访问),系统Bwww.java4y.com发现用户并没有登录,于是重定向到sso认证中心,并将自己的地址作为参数。请求的地址如下:
www.sso.com?service=www.java4y.com 注意,因为之前用户与认证中心www.sso.com已经建立了全局会话(当时已经把Cookie保存到浏览器上了),所以这次系统B重定向到认证中心www.sso.com是可以带上Cookie的。
认证中心根据带过来的Cookie发现已经与用户建立了全局会话了,认证中心重定向回系统B,并把Token携带过去给系统B,重定向的地址如下:
www.java4y.com?token=xxxxxxx 接着,系统B去sso认证中心验证这个Token是否正确,如果正确,则系统B和用户建立局部会话(创建Session)。到此,系统B和用户已经是登录状态了。
看到这里,其实SSO认证中心就类似一个中转站。
|