单点登录(SSO)-基础概念
Posted IT-老牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单点登录(SSO)-基础概念相关的知识,希望对你有一定的参考价值。
文章目录
1.什么是单点登录?
单点登录的英文名叫做:Single Sign On
(简称SSO)。
在初学/以前的时候,一般我们就单系统,所有的功能都在同一个系统上。
后来,我们为了合理利用资源和降低耦合性,于是把单系统拆分成多个子系统。
比如阿里系的淘宝和天猫,很明显地我们可以知道这是两个系统,但是你在使用的时候,登录了天猫,淘宝也会自动登录。
简单来说,单点登录就是在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。
2.回顾单系统登录
众所周知,HTTP是无状态的协议,这意味着服务器无法确认用户的信息。于是乎,W3C就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie。
如果说Cookie是检查用户身上的”通行证“来确认用户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认用户的身份的。Session相当于在服务器中建立了一份“客户明细表”。
HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一个用户。于是乎:服务器向用户浏览器发送了一个名为JESSIONID的Cookie,它的值是Session的id值。其实Session是依据Cookie来识别是否是同一个用户。
所以,一般我们单系统实现登录会这样做:
登录:将用户信息保存在Session对象中
- 如果在Session对象中能查到,说明已经登录
- 如果在Session对象中查不到,说明没登录(或者已经退出了登录)
注销(退出登录):从Session中删除用户的信息
记住我(关闭掉浏览器后,重新打开浏览器还能保持登录状态):配合Cookie来用
3.多系统登录的问题与解决?
3.1.Session不共享问题
单系统登录功能主要是用Session保存用户信息来实现的,但我们清楚的是:多系统即可能有多个Tomcat,而Session是依赖当前系统的Tomcat,所以系统A的Session和系统B的Session是不共享的。
解决系统之间Session不共享问题有一下几种方案:
- Tomcat集群Session全局复制(集群内每个tomcat的session完全同步)【会影响集群的性能呢,不建议】
- 根据请求的IP进行Hash映射到对应的机器上(这就相当于请求的IP一直会访问同一个服务器)【如果服务器宕机了,会丢失了一大部分Session的数据,不建议】
- 把Session数据放在Redis中(使用Redis模拟Session)【建议】
我们可以将登录功能单独抽取出来,做成一个子系统。
总结:
- SSO系统生成一个token,并将用户信息存到Redis中,并设置过期时间
- 其他系统请求SSO系统进行登录,得到SSO返回的token,写到Cookie中
- 每次请求时,Cookie都会带上,拦截器得到token,判断是否已经登录
到这里,其实我们会发现其实就两个变化:
- 将登陆功能抽取为一个系统(SSO),其他系统请求SSO进行登录
- 本来将用户信息存到Session,现在将用户信息存到Redis
以上是关于单点登录(SSO)-基础概念的主要内容,如果未能解决你的问题,请参考以下文章