最近跟组织一起学习,本来说好的学习大数据,不知道怎么的,忽然一看材料,莫名转战到了分布式,搞起了高级架构的知识了。
看了看故事的梗概,还不错,从基础的分布式调用和架构设计,再到事务一致性,HA,到web应用,数据库高可用和性能优化等一系列,也算是有一个很不错的体系,就计划坚持着学下去了。
在学习分布式系列之前,曾经也花了一段时间了解过单点登录和Session共享的问题,只不过当时没有比较深入的学习和分析过,只是简单的看过一些shiro视频和博客,希望借着这次机会,从理论上和代码层面都有一个比较深刻的认识。
好了,啰嗦的够多了,进入正题环节。
单点登录解决的问题其实很简单,就是通过一个用户认证系统,打通所有关联子系统的认证,从而达到安全高效访问子系统的目的。而session共享是实现的单点登录的一种方式。
一、真伪单点登录
何为真单点,何为伪单点呢?其实理解起来也很简单。
伪单点,举个例子,比如一般中小公司里的内部系统,这类系统一般只有一套用户认证和权限系统,各子系统之间也都是相互信任的,对用户的验证方式都是统一的,这类就是伪单点;
像两个比较大型的系统之间的整合,比如A公司的a系统要整合到B公司的b系统中,两个系统之前肯定不是统一的验证方式,信任什么的更不用提了,这类单点就稍微复杂一些,也就是真单点。
二、如何解决单点问题
关于解决单点问题,其实有比较成熟的策略了,适合各种简单或复杂的业务场景。
1、简单些的,比如,使用shiro进行会话管理;
2、服务器间的session复制;
3、shiro+cas实现;
4、使用专业的SSO产品。
一般来说,shiro方式实现就可以了,大型企业或需要实现真单点的,一般可能会使用到专业的SSO产品。
三、实现原理
从上图可以看出,客户端在访问系统时:
1、要先通过认证服务器,认证服务器在用户登陆后,会颁发一个ticket;
2、客户端拿到ticket后,再去访问子系统;
3、若子系统无法识别,或检测到非法,会再次转到认证服务器,让客户端再次登录。
客户端get到ticket后,在到达每个子系统之前,都会被检测一下ticket,也就是检查用户的登录信息。
今天先到这里,简单描述了基本的单点登录原理,下一篇会根据更详细的流程图分析一下代码实现。