完全跨域下单点登录的一种解决方案

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lchpersonal521/article/details/52223597

  根据oums单点登录解决方案介绍 一文我们知道单点登录有两种模型,一种是共同父域下的单点登录(例如域名都是 xx.a.com),还有就是完全跨域下的单点登录(例如域名是xx.a.com,xx.b.com),本文我们讲一下完全跨域下的单点登录该怎么实现。
  基于安全考虑,想通过cookie来实现这个功能是不太可能的了(也许有其他黑科技可以实现,这里不做讨论)。这里介绍的方案是参考shiro框架的跨域session共享方案来实现的。我们知道浏览器访问系统的时候会生成一个session,那么每次请求如何知道是来自同一个浏览器呢?是因为浏览器为每个域存储了一个可以称作为session的cookie的东西,每次请求该域都会把对应的这个cookie带上,然后服务器根据这个cookie值去查找对应的session。想要达到完全跨域的单点登录要满足两个条件:首先要让session可以被所有系统都访问到。其次要让同一个浏览器下的想要实现跨域的所有系统都使用同一个session。第一个条件通过使用spring-session框架把session存储在redis中,可以很容易实现。那么第二个条件如何实现呢?答案就是想方法为每个域设置相同的session的cookie 。举个例子,比如有a、b两个站点域名分别是www.a.com,www.b.com,这两个域名需要共享session,并且已b域名下的session为主,a登录时跳转到b域进行登录,成功登录之后重定向到a时把sessionid带上,a站点拿到sessionid之后回写到浏览器覆盖原来生成的session的cookie。这是再次访问a站点用的就是同一个session了。大概画一个图如下:
  这里写图片描述
  上述方案可以实现完全跨域下的单点登录,但是存在一个很大的问题,就是安全问题!假如在第④步操作重定向回a站点时,请求链接被不法分子拦截到了,他拿着这个链接就可以直接访问a站点了。
  
  安全问题解决方案如下图:
  这里写图片描述
  其实⑥、⑦两步主要要解决的问题是,向b(认证服务器)证明:“我是我,我不是不法分子”。至于SSL如何保证通讯安全性的这里就不做描述了。
 
  

展开阅读全文

没有更多推荐了,返回首页