SSO单点登录

什么是SSO

SSO全称为Single Sign On,即单点登录,指在多个应用系统的集合中,用户只需要在任意一个系统中登录成功,就能在其他系统同样保持登录状态,极大提高用户体验度,比如在淘宝(www.taobao.com)登录成功后,打开天猫的主页(www.tmall.com),用户同样处于登录状态。

Cookie作用域

Cookie有两个重要属性:Domain和Path,用来指示cookie的作用域。

浏览器提交请求时,一个cookie需要同时满足如下两点,才会被添加到请求头提交到请求服务器:

  1. 请求的域名必须是此cookie的Domain属性的子域名或者就是就是Domain本身。

  2. 请求的路径必须是此cookie的Path属性的子路径或者本身。

SSO实现原理

保持登录状态主流方式是通过登录cookie来实现的,一般来说有两个条件:

  1. 不同系统中对于登录cookie的验证方式一致,比较好的方式就是实现一个统一登录模块。

  2. 不同系统可以共用一次登录产生的登录cookie。

实现的难点主要是第二点,对于拥有同一个顶级域名的系统,实现cookie共享就很简单。比如同花顺网站t.10jqka.commedia.10jqka.com这两个系统,因为顶级域名相同,属于cookie的作用域内。只需要将cookie设置到 *.10jqka.com,这样请求上述两个网站就会发送对应的cookie。但如果请求了www.iwencai.com,因为之前cookie的作用域是 *.10jqka.com,所有请求中并不会附带登录cookie。

 

​如何解决Cookie作用域问题

解决作用域的方案初步考虑有两个

① 通过redis避免跨域请求

用户登录成功后,可以将cookie的值存入各系统公共的redis集群,key用于判断用户,只能通过用户请求ip来区别,当用户登录其他系统应用时,系统获取用户ip去redis集群查值,如果有值就取出来将cookie设置到当前系统的域名下。

但是,这个方法存在很多致命缺陷!如下:

  1. redis值得过期时间应该与cookie过期时间一致,一般为1周,对于访问量极大的网站,redis集群将面临很大考验。

  2. 除了根据ip我暂时没想出其他有效的方法来区分一个用户,但是对于现在的网络环境,用户的ip并不是独占的,极有可能A用户下线后,他使用的IP就分给了B用户,那么B用户就可以直接登录A用户的账号了!

②直面跨域,通过跨域cookie获取token

redis的key使用一个随机生成的token来代替IP,并且将token值存入cookie,这样产生的问题就是用户访问其他域名下的系统时,因为同源策略,无法获取之前登录cookie中的token值,更别说整个cookie值了。这时就必须要跨域去取token值。

这时候统一登录入口的优势就出来了,因为通过统一入口登录的系统,在统一登录的网站下一般都存有该作用域下的cookie,这样后面不管新增多少系统,都只需要向统一登录的域名请求跨域cookie即可。

试想如果A、B、C两个系统各自实现了登录入口且域名各不相同,那么如果在A上登录成功,那么B、C需要向A域名请求跨域cookie,如果是B上登录成功,那么C代码中又要改成向B域名请求cookie,后期系统躲起来,对于后期维护是非常麻烦的。

如何跨域请求cookie请看这里:浏览器安全

获取到cookie的token以后,就可以到redis集群获取cookie,然后在当前域名下设置cookie,就实现了单点登录的功能。

这里可以有个优化,可以在请求跨域cookie这个步骤再将cookie的信息存入redis,而且此时可以不用将token存入cookie,直接将token凭借到请求源url,类似做一个回调,然后请求源获取到token值就可以进行cookie的后续处理了!此时redis数据的生命周期可以设置成几十秒,并且只有在需要SSO的时候才会向Redis存入数据。极大减轻了Redis的负担。

 

③跨域获取cookie

此方案与方案二类似,只是不需要将cookie存储到redis中,而是直接通过ajax将登录cookie取出来,然后设置到本地即可,具体实现步骤这里就不详述了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值