Web应用系统的演化总是从简单到复杂,从单功能到多功能模块再到多子系统方向发展。

.当前的大中型Web互联网应用基本都是多系统组成的应用群,由多个web系统协同为用户提供服务。

多系统应用群,必然意味着各系统间既相对独立,又保持着某种联系。

独立,意味着给用户提供一个相对完整的功能服务,比如C2C商城,比如B2C商城。联系,意味着从用户角度看,不管企业提供的服务如何多样化、系列化,在用户看来,仍旧是一个整体,用户体验不能受到影响。

譬如用户的账号管理,用户应该有一个统一账号,不应该让用户在每个子系统分别注册、分别登录、再分别登出。系统的复杂性不应该让用户承担。

登录用户使用系统服务,可以看做是一次用户会话过程。在单Web应用中,用户登录、登录状态判断、用户登出等操作,已有很常规的解决方案实现。

在多系统应用群中,这个问题就变得有些复杂,以前本不是问题的问题,现在可能就变成了一个重大技术问题。我们要用技术手段,屏蔽系统底层本身的技术复杂性,给用户提供自然超爽的用户体验。

这就是我们所说的单点登录问题,即SSO(Single Sign On)。当然,我们这里主要讨论的是Web系统,确切地讲,应该叫Web SSO。

下面我们来看一个现实中SSO的例子,例如阿里系统:

阿里目前给用户提供的服务很庞大,种类也很繁多,我们看几个典型系统应用:www.taobao.com 淘宝应用、www.tmall.com 天猫应用、
www.alitrip.com 阿里旅游。这些应用,当用户访问时,都需要登录

显然,对用户来说,他不希望每个子应用分别登录,因为这都是阿里服务,在用户看来,就相当于一个大系统。

当我在一个应用如淘宝上登录后,再访问阿里旅游、天猫等其它系统,我们发现,系统都显示已登录状态。

当在任意一系统退出登录后,再刷新访问其它系统,均已显示登出状态。

可以看出,阿里实现了SSO。实际上,几乎所有提供复杂服务的互联网公司,都实现了SSO,如阿里、百度、新浪、网易、腾讯、58...

SSO问题,是大中型Web应用经常碰到的问题,是Java架构师需要掌握的必备技能之一,中高级以上Web工程师都应对它有个了解。

SSO有啥技术难点?为什么我们不能像解决单Web应用系统登录那样自然解决?为说清楚这一问题,我们得先了解下单应用系统下,用户登录的解决方案。

我们讨论的应用是Web应用,大家知道,对于Web应用,系统是Browser/Server架构,Browser和Server之间的通信协议是HTTP协议。

HTTP是一个无状态协议。即对服务器来说,每次收到的浏览器HTTP请求都是单一独立的,服务器并不考虑两次HTTP请求是否来自同一会话,即HTTP协议是非连接会话状态协议。

对于Web应用登录,意味着登录成功后的后续访问,可以看做是登录用户和服务端的一次会话交互过程,直到用户登出结束会话。

如何在非连接会话协议之上,实现这种会话的管理? 我们需要额外的手段。

通常有两种做法,一种是通过使用HTTP请求参数传递,这种方式对应用侵入性较大,一般不使用。

另一种方式就是通过cookie。

cookie是HTTP提供的一种机制,cookie代表一小撮数据。服务端通过HTTP响应创建好cookie后,浏览器会接收下来,下次请求会自动携带上返回给服务端。

利用这个机制,我们可以实现应用层的登录会话状态管理。例如我们可以把登录状态信息保存在cookie中,这是客户端保存方式。

由于会话信息在客户端,需要维护其安全性、需要加密保存、携带量会变大,这样会影响http的处理效率,同时cookie的数据携带量也有一定的限制。

比较好的方式是服务端保存,cookie只保存会话信息的句柄。即在登录成功后,服务端可以创建一个唯一登录会话,并把会话标识ID通过cookie返回给浏览器,浏览器下次访问时会自动带上这个ID,服务端根据ID即可判断是此会话中的请求,从而判断出是该用户,这种操作直到登出销毁会话为止。

令人高兴的是,我们使用的Web应用服务器一般都会提供这种会话基础服务,如Tomcat的Session机制。也就是说,应用开发人员不必利用Cookie亲自代码实现会话的创建、维护和销毁等整个生命周期管理,这些内容服务器Session已经提供好了,我们只需正确使用即可。

当然,为了灵活性和效率,开发人员也可直接使用cookie实现自己的这种会话管理。

对于Cookie,处于安全性考虑,它有一个作用域问题,这个作用域由属性Domain和Path共同决定的。也就是说,如果浏览器发送的请求不在此Cookie的作用域范围内,请求是不会带上此Cookie的。

Path是访问路径,我们可以定义/根路径让其作用所有路径,Domain就不一样了。我们不能定义顶级域名如.com,让此Cookie对于所有的com网站都起作用,最大范围我们只能定义到二级域名如.taobao.com,而通常,企业的应用群可能包含有多个二级域名,如taobao.com、tmail.com、alitrip.com等等。

这时,解决单系统会话问题的Cookie机制不起作用了,多系统不能共享同一会话,这就是问题的所在!
当然,有的同学会说:我把所有的应用统一用三级域名来表示,如a.taobao.com、b.taobao.com、c.taobao.com或干脆用路径来区分不同的应用如www.taobao.com\a、www.taobao.com\b、www.taobao.com\c,这样cookie不就可以共享了么?

事实是成立的,但现实应用中,多域名策略是普遍存在的,也有商业角度的考虑,这些我们必须要面对。

退一步讲,即使cookie可以共享了,服务端如何识别处理这个会话?这时,我们是不能直接使用服务器所提供的Session机制的,Session是在单一应用范围内,共享Session需要特殊处理。

更复杂的情况是,通常这些子系统可能是异构的,session实现机制并不相同,如有的是Java系统,有的是PHP系统。共享Session对原系统入侵性很大。

至此,SSO技术问题这里讲清楚了。那我们有没有更好的通用解决方案?答案肯定是有的,但比较复杂,这也是我们专题讨论的理由。总体来说,我们需要一个中央认证服务器,来统一集中处理各子系统的登录请求。这是入门,后续会有系列文章深层次探讨。


作者: 手插口袋_ 
链接:http://www.imooc.com/article/3555
来源:慕课网

(转)《SSO CAS单点系列》之 15分钟让你了解SSO技术到底是个什么鬼!的更多相关文章

  1. (转)《SSO CAS单点系列》之 实现一个SSO认证服务器是这样的!

    上篇我们引入了SSO这个话题<15分钟了解SSO是个什么鬼!>.本篇我们一步步深入分析SSO实现机理,并亲自动手实现一个线上可用的SSO认证服务器!首先,我们来分析下单Web应用系统登录登 ...

  2. SSO CAS 单点系列

    在多系统应用群中,使用,例如,用户账户管理,用户应该有一个统一的账户,不应该让用户在每个子系统分别注册 登陆再分别登出.这就是我们所说的单点登陆问题,即SSO: SSO问题,时大中型web应用经常碰到 ...

  3. 《SSO CAS单点系列》之 APP原生应用如何访问CAS认证中心

    4.开发支持APP登录的移动服务端接口.接收APP登录请求,采用HttpClient转发至CAS认证中心登录,返回json数据解析并最终返回给客户端.本地会话采用redis维护,登录成功,返回acce ...

  4. Bash脚本15分钟进阶教程

    转载: Bash脚本15分钟进阶教程 这里的技术技巧最初是来自谷歌的"Testing on the Toilet" (TOTT).这里是一个修订和扩增版本. 脚本安全 我的所有ba ...

  5. SSO单点登录系列5:cas单点登录增加验证码功能完整步骤

    本篇教程cas-server端下载地址:解压后,直接放到tomcat的webapp目录下就能用了,不过你需要登录的话,要修改数据源,C:\tomcat7\webapps\casServer\WEB-I ...

  6. cas系列(一)--cas单点登录基本原理

    (这段时间打算做单点登录,因此研究了一些cas资料并作为一个系列记录下来,一来可能会帮助一些人,二来对我自己所学知识也是一个巩固.) 一.为什么要实现单点登录 随着信息化不断发展,企业的信息化过程是一 ...

  7. SSO之CAS单点登录实例演示

    本文目录: 一.概述 二.演示环境 三.JDK安装配置 四.安全证书配置 五.部署CAS-Server相关的Tomcat 六.部署CAS-Client相关的Tomcat 七. 测试验证SSO 一.概述 ...

  8. 【SSO单点系列】(1):CAS4.0 环境的搭建

    一.概述 今天开始写CAS相关的第一篇文章,这篇文章主要是关于CAS环境的搭配,提供给刚刚接触CAS的一个入门指南,并演示一个CAS的最简单的实例 二.环境要求 博主的环境如下: win8.1 64 ...

  9. 【SSO单点系列】(2):CAS4.0 登录页的个性化定制

    上一篇 [SSO单点系列](1):CAS环境的搭建介绍了CAS最简单环境的搭建,以及一个例子用来讲解CAS的一个最基础的用法. 今天主要是介绍如何对CAS登录页进行个性化定制.    一.开始 下图是 ...

随机推荐

  1. 了解 Go 1.9 的类型别名

    http://colobu.com/2017/06/26/learn-go-type-aliases/

  2. C51中遇到一个有关data与xdata的问题,已解决

    环境: 我在某个C文件定义了一个结构体变量,然后该变量仅仅是在本文件内被一个函数使用,然后又在中断中调用了该函数,目的是改变一个IO口的输出状态,结果运行时怎么也达不到要的效果. struct BE ...

  3. day06<面向对象>

    面向对象(面向对象思想概述) 面向对象(类与对象概述) 面向对象(学生类的定义) 面向对象(手机类的定义) 面向对象(学生类的使用) 面向对象(手机类的使用) 面向对象(一个对象的内存图) 面向对象( ...

  4. dos命令临时和永久设置环境变量方法

    方法一:批处理中,修改环境变量,一次性有效(也就是在当前的脚本中有效)   CMD中运行:set path==%path%;d:/mypath   用 set path可以查看,当前的环境变量   方 ...

  5. Tomcat连接参数的优化,主要是针对吞吐量做优化

    Tomcat连接参数的优化,主要是针对吞吐量做优化: 修改conf/server.xml文件,把原来 <Connector port="8080" protocol=&quo ...

  6. linux--GCC简单用法

    gcc是linux下最常用的一款c编译器,对应于CPP 有相应的g++工具,debug有gdb,只是还不会用. 个人感觉gcc确实是个好东西,完全可以直接在gedit下编程然后写个shell脚本用gc ...

  7. PHP读取远程文件的三种方法

    file_get_contents <?php$url = http://www.xxx.com/;$contents = file_get_contents($url);//如果出现中文乱码使 ...

  8. Spring AOP教程及实例

    1.教程转载==>>:http://blog.csdn.net/wangpeng047/article/details/8556800 2.实例转载==>>:http://bl ...

  9. Java虚拟机原理图解

    具体详情参考: http://blog.csdn.net/luanlouis/article/details/41046443 http://blog.csdn.net/luanlouis/artic ...

  10. CSS 3D的应用记录

    为父元素添加以下样式后,子元素即可使用3D属性,例如translateZ /*设置子元素也应用3D效果*/-webkit-transform-style: preserve-3d;-moz-trans ...