单点登录(SSO)实现
1. 说明
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一
SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统
SSO 一般都需要一个独立的认证中心(passport),子系统的登录均得通过passport,子系统本身将不参与登录操作
当一个系统成功登录以后,passport将会颁发一个令牌给各个子系统,子系统可以拿着令牌会获取各自的受保护资源,为了减少频繁认证,各个子系统在被passport授权以后,会建立一个局部会话,在一定时间内可以无需再次向passport发起认证
2. 同域名下的单点登录
cookie
的domain
属性设置为当前域的父域,并且父域的cookie
会被子域所共享。path
属性默认为web
应用的上下文路径
利用 Cookie
的这个特点,我们只需要将Cookie
的domain
属性设置为父域的域名(主域名),同时将 Cookie
的path
属性设置为根路径,将 Session ID
(或 Token
)保存到父域中。这样所有的子域应用就都可以访问到这个Cookie
不过这要求应用系统的域名需建立在一个共同的主域名之下,如tieba.baidu.com
和 map.baidu.com
,它们都建立在 baidu.com
这个主域名之下,那么它们就可以通过这种方式来实现单点登录
3. 不同域名下的单点登录
这里只介绍使用过的:CAS(Central Authentication Service) 官网流程图:
app1登录
- 用户访问app1系统,app1系统是需要登录的,但用户现在没有登录。重定向到sso认证中心,并将自己的地址作为参数。
www.sso.com?service=www.java3y.com
(www.java3y.com视为app系统的地址) - 跳转到CAS server,即SSO登录系统,以后图中的CAS Server我们统一叫做SSO系统。 SSO系统也没有登录,弹出用户登录页。
- 用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器(Browser)中写入SSO域下的Cookie。即:用户与认证中心建立全局会话(生成一份Token,写到Cookie中,保存在浏览器上) )
- 认证中心重定向回app系统,并把Token携带过去给app1,重定向的地址如:
www.java3y.com?token=xxxxxxx
SSO系统登录完成后会生成一个ST(Service Ticket) ,然后跳转到app1系统,同时将ST作为参数传递给app1系统。 - app1系统拿到ST后,从后台向SSO发送请求,验证ST是否有效。
- 验证通过后,app1系统将登录状态写入session并设置app域下的Cookie。注意,此处的 cookie 和 session 保存的是用户在 app1 系统的登录状态,和 CAS 无关。
app2登录时:
- 用户访问app2系统,app2系统没有登录,跳转到SSO。
- 由于SSO已经登录了,不需要重新登录认证。
- SSO生成ST,浏览器跳转到app2系统,并将ST作为参数传递给app2。
- app2拿到ST,后台访问SSO,验证ST是否有效。
- 验证成功后,app2将登录状态写入session,并在app2域下写入Cookie。