开发者社区> 杨俊明> 正文

基于Spring的简易SSO设计

简介: 通常稍微规模大一些的企业,内部已经有很多的应用系统,多个系统整合首先要解决的便是“统一登录(SSO)”问题,之前写过一篇 利用Membership实现SSO(单点登录) ,java环境下已经有一些开源的成熟sso项目(比如CAS),但如果觉得CAS太麻烦,想自己再造轮子重复发明一个,可以参考下面的思...
+关注继续查看

通常稍微规模大一些的企业,内部已经有很多的应用系统,多个系统整合首先要解决的便是“统一登录(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设计
通常稍微规模大一些的企业,内部已经有很多的应用系统,多个系统整合首先要解决的便是“统一登录(SSO)”问题,之前写过一篇 利用Membership实现SSO(单点登录) ,java环境下已经有一些开源的成熟sso项目(比如CAS),但如果觉得CAS太麻烦,想自己再造轮子重复发明一个,可以参考下面的思...
1082 0
《Spring技术内幕》——3.2节Spring AOP的设计与实现
本节书摘来自华章社区《Spring技术内幕》一书中的第3章,第3.2节Spring AOP的设计与实现,作者:计文柯,更多章节内容可以访问云栖社区“华章社区”公众号查看
1352 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18805 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
25145 0
源码专题之spring设计模式:动态代理
jdk动态代理 代码实现 满足代理模式应用场景的三个必要条件 两个角色:执行者、被代理对象 注重过程,必须要做,被代理对象没时间做或者不想做(怕羞羞),不专业 执行者必须拿到被代理对象的个人资料(执行者持有被代理对象的引用) jdk的动态代理通过调用Proxy.
2164 0
装饰设计模式图解
装饰设计模式(IO流中用的多)   装饰设计模式的概述     装饰模式就是使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类。是继承的替代方案。   优点     使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添加对象的功能,并且可以随意的组合这些功能。
700 0
IOS设计模式第五篇之装饰设计模式的代理设计模式
版权声明:原创作品,谢绝转载!否则将追究法律责任。   代理: 另一个装饰设计模式,代理,是一个代表或者协调另一个对象的行为机制。例如当你用一个tableView,你必须实现他里面的一个tableView:numberOfRowsInSection:.方法。
934 0
IOS设计模式第八篇之键值观察模式
版权声明:原创作品,谢绝转载!否则将追究法律责任。 键值观察模式: 在KVO,一个对象可以要求被通知当他的某个特殊的属性被改变了。自己或者另一个对象。如果你感兴趣你可以阅读更多的信息参考: Apple’s KVO Programming Guide. 怎么用KVO设计模式呢? 正如上面提及到的。
811 0
+关注
杨俊明
菩提树下的杨过 http://yjmyzz.cnblogs.com/
1105
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载