再说单点登录(SSO)中的CAS认证,我们需要一种全新的登录方式来实现多系统应用组的登录,这就是单点登录。Web系统已经从单一的系统发展成为由多个系统组成的应用群。复杂度应该由系统自己来承担,而不是由用户来承担。无论多么复杂的Web系统,对于用户来说都是一个统一的整体。也就是说,用户访问web系统的整个应用组与访问单个系统是一样的。仅一次登录/注销就足够了。SSO定义SSO(Singlesign-on)即单点登录,为许多相互关联但独立的软件系统提供访问控制的一种方法。SSO(Singlesign-on)是比较流行的企业业务集成解决方案之一。SSO(Singlesign-on)的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。以游乐场的通票为例:我们只需要买一次通票就可以游玩所有的游乐场,过山车、摩天轮都不需要重新买票。在这里,买票相当于登录认证,游乐园相当于公司使用一套SSO,各种游乐设施相当于公司的各种产品。类比各个子系统的认证,如图,三种SSO,各个子系统在同一个站点下,各个子系统在同一个顶级域名下,同一个站点的单点登录和同一个顶级域是基于Cookie顶级域的共享特性。目前数据栈只需要在UIC的登录页面登录一次,就可以在各个子应用之间跳转。这个操作是基于将cookie中的domain设置为顶级域名。每个子系统属于不同的顶级域。如果它们属于不同的域,则不同域之间的cookie不会共享。该怎么办?接下来说说CAS(CentralAuthenticationService)流程,这是一个标准的单点登录流程,一个企业级的开源项目,旨在为Web应用系统提供可靠的SSO解决方案。它只是一种SSO解决方案。它的过程其实和Cookie-session模式是一样的。单点登录是指每个子系统都有一套完整的Cookie-session模式,外加一套Cookie-session模式的SSO系统。第一次访问APP1:当用户访问APP1需要登录时,会重定向到CASServer,在CASServer上对账号和密码进行认证。CASServer会保存session,生成sessionId返回给SSOClient,SSOClient写入当前域的Cookie。同时根据TGT下发一个ST传入APP1APP1携带ST到CASServer请求验证。CASServer验证成功后,将登录状态返回给APPI服务器。APPIserver将登录状态写入session,生成sessionId,返回给APPIClient。然后做登录认证,即同域下的认证。首次访问APP2:用户访问系统APP2。跳转到SSO准备登录时,发现SSO已经登录了,于是SSO生成ST,携带ST到APP2APP2,携带ST到CASServer请求验证。CASServer验证成功后,返回登录状态给APP2服务器。APP2server将登录状态写入session中,生成一个sessionId返回给APPIClient。在这个过程中,APP2不需要经过登录过程CASticketTGTCASServer创建TGT,并保存在CASServer的Session中。根据用户信息发布的TGC创建TGT,同时生成TGC。通过CASServer的响应头的set-cookie字段设置TGC,唯一标识用户身份(sessionId)SSO)&SingleSign-OnLogout(SLO)SingleSign-On(SSO)第一次访问APP1:访问APP1服务地址,APP1请求鉴权失败,重定向到CASServer地址。访问CASServer地址,发送认证请求,带上cookie。CASServer识别用户没有cookie信息且未登录,返回CAS登录页面地址。用户输入正确的账号密码,CASServer用户认证通过,创建SSOSession。重定向回APP1的服务地址,并在cookie中创建CASTGC,TGC中包含Ticket(TGT),TGT是SSOSession的key。访问APP1的服务地址,带上ST,client拿到ST向CASServer进行认证。CASServer认证成功,返回响应信息给APPIAPPI。得到成功响应后,设置Session,重定向回APP1地址,设置CookieJSESSIONID。APPI使用cookie中的信息发起请求,其中JSESSIONID用于确定当前用户对应的session信息,发送给客户端进行校验。客户端使用JSESSIONID来验证Session中存储的数据。如果验证通过,则返回正确内容,表明APP1第二次访问APP1:APPI发起请求,将cookie中的JSESSIONID带到APPI服务器。APPI服务器使用JSESSIONID来检查存储在Session中的数据。验证通过,返回正确内容,显示APP1。在APP1登录成功的情况下,第一次访问APP2:访问APP2的服务地址,APP2的请求鉴权不通过,重定向到CASServer地址。访问CASServer地址,发送带有TGT信息的认证请求。CASServer使用TGT查找SSO信息进行身份验证。鉴权通过后,生成ticketST,重定向到APP2的服务地址。APP2服务携带ST到CASServer进行鉴权。CAS服务器认证成功,返回客户端通过的响应。客户端收到成功响应后,设置Session,重定向到APP2的地址,并设置CookieMOD_AUTH_CAS_S。APP2发起请求,cookie中带有MOD_AUTH_CAS_S,发送给客户端进行验证。客户端使用MOD_AUTH_CAS_S来验证会话中存储的数据。验证通过,返回正确内容,显示APP2。官方时序图SingleLogout(SLO)APP1平台请求退出后,首先在查询中携带service字段重定向CAS退出地址。用户携带服务查询字段和CASTGC请求给CASServer。CASServer根据CASTGC找到TGT信息。删除TGT完成CAS注销CASServer可以获取TGT中所有关联的ST,根据ST找到对应的应用注册信息,调用logoutUrl,将ST打包成logoutRequest发给APP1APP1根据logoutRequest找到ST,在Session中找到ST删除以ST为key的值,清除登录状态APP1注销成功APP2根据logoutRequest找到ST,在Session中找到以ST为key的值删除,清除登录状态APP2注销成功