通常稍微规模大一些的企业,内部已经有很多的应用系统,多个系统整合首先要解决的便是“统一登录(SSO)”问题,之前写过一篇 利用Membership实现SSO(单点登录) ,java环境下已经有一些开源的成熟sso项目(比如CAS),但如果觉得CAS太麻烦,想自己再造轮子重复发明一个,可以参考下面的思路:(仍然是基于Cookie的实现,只不过安全性上略有加强,cookie端存放的token标识,不再与用户名、密码等这些敏感信息相关)

1、组件图

主要由3大部分组成,

1.1 SSO Client Filter 类似Asp.Net中的HttpMudule,用来拦截client webapp的所有请求,如果发现Cookie中没有已登录的token标识,则将请求重定向到sso 站点的login页面;此外,它还用于接收SSO登录成功后返回的token标识

1.2 SSO App 即SSO的主站点,提供统一的登录认证,并将认证后的token返回给Client WebApp;以及验证Client WebApp发送来的token是否合法。

1.3 Token Store ,用于存放所有当前登录成功的token-user的映射关系,通常是一个key-value的hash结构,通过token(key),可找到相应的用户(value)关键信息(比如:用户名等),物理上,可用cache server/nosql db等轻量级的产品实现。

2、部署图

3、SSO Client Filter的序列图

verify token(A)

解释:

当用户要访问Client Website中的某个页面时,该请求首先被SSO Client Filter拦截,然后按以下流程处理:

1. 先从cookie中查找token标识

2. 如果没找到token

3. 直接重定向到sso的login页面,并在returnURL参数中,将请求页面传递给sso

3.1 登录成功后,生成一个token字符串,然后将token-user info的映射关系,存入token server

3.2 同时重定向到Client Website登录前的页面,并在url中附加一个token参数

3.2.1 Client Website收到返回的token url参数后,写入Cookie

3.2.2 将token参数从url中去掉,重定向到登录前的请求页面(即:returnURL)

转入下面的处理:

verify token(B)

1.再次从cookie中查找token

2.如果找到,则请求sso site验证token的合法性(因为cookie中的token有可能是伪造的,或者已经失效),并带上returnURL(以便验证通过后,能重定向到用户需要访问的页面)

3 sso收到请求的token后,到token server中验证真伪(带上当前请求页面地址,做为returnUrl附带在url参数中)

4 token server返回验证结果

5 如果校验失败,则跳转到登录页面,要求重新登录(带returnUrl)

6 如果验证通过,返回成功标识

7 子站点拿到成功标识后,大功告成,剩下该干啥干嘛(即:正常执行页面上的常规处理)

验证通过后,再访问其它页面时,因为本地cookie中已经有token标识,所以将直接执行 verify token(B)处理。

性能分析:

从前面的分析可以看出,即使第一次认证成功后,后续的每个页面请求都要到SSO上验证token的真伪,这样如果并发用户比较多,SSO的压力略大,可以在client website中增加二级缓存,首次验证通过后,将token-user info的映射关系,存入Client Website自己的缓存中,这样后续其它页面验证token时,直接到client website的cache中验证即可,但这样做的前提是client website中的token cache过期时间一定要小于sso token server中的过期时间,否则SSO Token Server中的token已经失效,但是client website中的token仍有效,就失去验证token真伪的意义了。另外,这样处理后,性能虽然提高了,但安全性从理论上讲,将所有折扣。

安全性分析:
token的生成算法很关键,不要与用户名、密码、用户角色等这些敏感信息相关,要保证生成的唯一字符串没有实际业务意义(比如:可用uuid/guid之类),同时若cookie中token被窃取,为了将危害降到最低,每次token验证成功后,最好重新生成新的token,类似手机动态密码一样,用过即换。

与Spring的关系:

讲了半天,似乎没看到任何Spring的影子,以上其实是SSO的通用思路,技术上适用于任何主流web技术,Spring-Security可以很容易实现SSO的用户Form Login登录认证,而Token Server可以用Spring-Cache来实现,至于SSO Client Filter、Client Website,Spring-MVC/Servlet Filter可以轻松搞定。

如何扩展到c/s应用

虽然SSO在很多情况下,用于整合web子系统,但只要略加改造,c/s应用其实也可以套用这个思路,比如:可以指定硬盘上某个xml文件(或windows注册表中自己新建一个项)用来保存token(相当于浏览器的cookie存储token),c/s的每个窗口统一继承至某个父窗口,在父窗口中,每次打开时,检测该xml中是否有token(相当于sso client filter所做的事情),如果没有,则弹出登录窗口,将用户名、密码参数,发送到sso进行认证(相当于重定向到sso的login页面认证),认证成功后,将服务端返回的token写入本地xml(相当于sso client filter接收token)

基于Spring的简易SSO设计的更多相关文章

  1. Spring Security OAuth2 SSO 单点登录

    基于 Spring Security OAuth2 SSO 单点登录系统 SSO简介 单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自 ...

  2. 基于Spring设计并实现RESTful Web Services(转)

    基于Spring设计并实现RESTful Web Services 在本教程中,你将会使用Spring来创建一个具有生产力的RESTful网络服务. 为什么用RESTful网络服务? 从和Amazon ...

  3. 基于Android 平台简易即时通讯的研究与设计[转]

    摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...

  4. 基于Spring Security2与 Ext 的权限管理设计与兑现

    基于Spring Security2与 Ext 的权限管理设计与实现 一.Spring Security介绍 Spring Security的前身Acegi,其配置及使用相对来说复杂一些,因为要配置的 ...

  5. 基于Spring Boot的统一异常处理设计

    基于Spring Boot的统一异常处理设计 作者: Grey 原文地址:https://www.cnblogs.com/greyzeng/p/11733327.html Spring Boot中,支 ...

  6. 基于Spring Boot的在线问卷调查系统的设计与实现+论文

    全部源码下载 # 基于Spring Boot的问卷调查系统 ## 介绍 > * 本项目的在线问卷调查调查系统是基于Spring Boot 开发的,采用了前后端分离模式来开发. > * 前端 ...

  7. 我的自定义框架 || 基于Spring Boot || 第一步

    今天在园子里面看到一位大神写的springboot做的框架,感觉挺不错,遂想起来自己还没有一个属于自己的框架,决定先将大神做好的拿过来,然后加入自己觉得需要的模块,不断完善 目前直接复制粘贴过来的,后 ...

  8. 基于Spring的可扩展Schema进行开发自定义配置标签支持

    一.背景 最近和朋友一起想开发一个类似alibaba dubbo的功能的工具,其中就用到了基于Spring的可扩展Schema进行开发自定义配置标签支持,通过上网查资料自己写了一个demo.今天在这里 ...

  9. 基于Spring的Web缓存

    缓存的基本思想其实是以空间换时间.我们知道,IO的读写速度相对内存来说是非常比较慢的,通常一个web应用的瓶颈就出现在磁盘IO的读写上.那么,如果我们在内存中建立一个存储区,将数据缓存起来,当浏览器端 ...

随机推荐

  1. Android进程管理及静态变量垃圾回收

    1.Android静态变量的生命周期 静态变量的生命周期遵守Java的设计.我们知道静态变量是在类被load的时候分配内存的,并且存在于方法 区.当类被卸载的时候,静态变量被销毁. 在PC机的客户端程 ...

  2. IT软件开发常用英语词汇

    Aabstract 抽象的abstract base class (ABC)抽象基类abstract class 抽象类abstraction 抽象.抽象物.抽象性access 存取.访问access ...

  3. javascript-简单工厂两种实现方式

    简单工厂笔记 两种方式: 第一种:通过实例化对象创建 第二种:通过创建一个新对象然后包装增强其属性和功能来实现 差异性:前一种通过类创建的 对象,如果这些类继承同一个父类,他们父类原型上的方法是可以共 ...

  4. 【转】虚拟机VMware3种网络模式(桥接、nat、Host-only)的工作原理

     VMware网络配置详解一:三种网络模式简介 安装好虚拟机以后,在网络连接里面可以看到多了两块网卡: 其 中VMnet1是虚拟机Host-only模式的网络接口,VMnet8是NAT模式的网络接口, ...

  5. cocos2d-x 3.10 屏幕适配问题

    cocos2d-x 的屏幕适配问题困扰了我很久,差不多有一个星期吧.通过亲身实践才解决了问题,分享一下解决办法,供大家借鉴学习. 其实解决办法很简单,把下面代码注释掉就好了 // if (frameS ...

  6. expr

    将变量的值当作数值处理而不是字符串,shell支持6种算术运算符:加+, 减-,乘\*,除/, 取余%, 括号\( \),每种算术运算符的两边都要有空格 $echo "Res = $(exp ...

  7. x01.os.5: DOS 功能调用

    DOS 功能调用(INT 21)-------------------------------AH = 0-2E 适用 DOS 1.0 以上版本AH = 2F-57 适用 DOS 2.0 以上版本AH ...

  8. 【学习笔记】Wireshark的用法

    计算机网络课上,需要我们灵活运用网络协议分析仪wireshark,最近一直在看,感觉有点难,并不是软件本身操作难,而是看懂一大群包的含义难,这个难主要也因为它是全英文的~~.. 好了,大致总结一下,基 ...

  9. java 判断两个时间相差的天数

    1.实现目标 输入:两个日期 输出:两个日期相差的天数 2.代码实现 方法1: 通过Calendar类的日期比较.注意:这里需要考虑一下: 日期是跨年份的,如一个是2012年,一个是2015年的   ...

  10. Hadoop2.6 datanode配置在线更新

    datanode 的配置可以在线更新了,http://blog.cloudera.com/blog/2015/05/new-in-cdh-5-4-how-swapping-of-hdfs-datano ...