最近在学习了单点登录系统,做一个总结。
首先来说一下,什么是单点登录系统(sso)。SSO英文全称Single Sign On。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。
以前的登录逻辑是如下所示。
以上的登录逻辑是在单台tomcat上没有任何逻辑问题,但是如果是多台tomcat,也就是tomcat集群,那么就存在一个用户信息session的共享问题。如下:
用户的第一次请求落在tomcat1上,第二次请求落在tomcat2上,假设用户第一次请求登录页面,这个请求落在tomcat1上,tomcat1返回登录页面,用户输入正确的账号密码之后提交,这个请求落在tomcat2上,那么这个session信息就存储在tomcat2上,接着你访问用户中心系统,很不幸这个请求落在了tomcat1,而tomcat1没有该用户的session信息,也就取不到用户的信息,所以只能再次登录。这样的话,系统的用户体验度就极差了。
解决方案:
第一种方案:可以配置tomcat的session共享。搭建集群,集群内的每一个tomcat都会向集群内其他的tomcat广播自己的session信息。其他的tomcat做session同步。
优点:不需要额外开发代码,只需要搭建tomcat集群即可。适用于小网站。
缺点:(1)tomcat 是全局session复制,集群内每个tomcat的session完全同步(也就是任何时候都完全一样的) 在大规模应用的时候,用户过多,集群内tomcat数量过多,session的全局复制会导致集群性能下降, 因此,tomcat的数量不能太多,5个以下为好。(2)不能解决分布式工程的session共享问题,例如支付宝和淘宝的单点登录问题。
第二种方案:实现单点登录系统,提供服务接口。把session数据存放在redis。
Redis可以设置key的生存时间、访问速度快效率高。
优点:redis存取速度快,不会出现多个节点session复制的问题。效率高。
缺点:需要程序员开发。
sso的登录流程如下: