5、设计思路及折衷
在常见的web站点中,当存在多个站点需要登陆,而这些站点都是使用同一套的登陆流程,
当用户在其中一个站点登陆后,其他站点并未记录用户的登陆信息,导致用户每次登陆新
站点需要进行新的登陆过程,这样给用户的体验是十分的不友好的,这时候就可以使用单点登陆,
单点注销的方式实现用户的登陆流程。
单点登陆设计流程如下图:
由于以上站点是使用session存储用户信息的,所以该设计模式是针对session存储用户信息的设计方式,
首先以上系统1,系统2,sso认证中心都可以当作不同的站点,但是是使用同一套用户体系。为了实现单点
登陆,需要一个站点记录各个站点状态,就是sso认证中心。这存在唯一的登陆入口,就是sso认证中心提供
的登陆地址。当用户访问系统1时,如果系统1判断用户已经登陆,那么直接访问系统1站点内的资源,如果用户未登录
则请求到sso认证中心,判断认证中心,用户是否登陆。
一:如果认证中心记录用户已经登陆,则将登陆后的用户信息通过
jwt加密成token,转发给系统1,系统1在通过认证中心判断token是否有效,如果token正确,系统解析token后,将用户信息存储到session,其中token通过存储到cookie,配置不同子域同cookie,这样不同的站点只要*域名相同也可以获取同一个cookie。
二:如果认证中心记录用户未登陆,则跳转到sso的登陆入口。
三:以上过程需要将系统1的访问地址作为参数,在跳转过程作为参数传递,登陆成功后直接跳转到系统1地址。
四:当每次在sso认证中心认证token过程中,需要记录下所有系统的地址,然后在对这些地址进行注销,实现单点注销
但是本文章中的系统采用的是session作为存储信息,如果要清除session需要带上每一个系统的cookie,然后通过这些cookie
请求每个系统的注销接口。而记录这些cookie和路由地址到sso认证中心的缓存中,当访问的用户多的话,每一个用户都记录一份系统路由,cookie,对服务器压力可能也会比较大,于是换个角度想想,可以将其中一个站点点击注销后,将一个标记变量记录到cookie,访问其他站点如果发现这个cookie标记,则清除session,如果这个cookie标记在登陆过程中存在,则清除否则就会一直不能登陆。这样的话只需要每一个用户的浏览器记录cookie,就减轻服务器压力。
下图是使用令牌实现单点注销:
性能:比较单点注销的话,对服务器压力比较小。
可扩展性:该sso系统封装和配置好了对应内容,可以在各个模块下扩展开发。
安全性:可能cookie会被篡改,导致单点登陆失效。