`
pavel
  • 浏览: 915690 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

单点登录的一种思路

阅读更多

=====================================
系统特性:
=====================================
1 基于http协议
2 支持跨域认证
3 各个子应用采用自己的登录入口,并且拥有独立的授权模块
4 支持子应用间的同步
5 重要信息加密后,通过hessian传递,并使用一次性ticketKey,安全性可以得到一定的保障。
6 绝对轻量级
7 基本原理应该(因为我没读过CAS的源代码,只看过一些相关文章,所以不敢肯定)类似CAS的基本模式(而不是它的代理模式).
  ( 当然要比CAS简单while(true){很多}了。 )
8 基于spring 和 hessian技术构建。缓存采用ehcache。

=====================================
术语解释:
=====================================
子应用:
就是需要提供单点登录的各个应用。

认证中心:
单点登录的认证中心。它也是个web应用。
可以把它理解为一个存放用户名和密码的公共空间,
各个子应用可以从它这里取用户名和密码,然后调用各自的授权模块对用户进行授权。
在该单点登录系统中,认证中心并不提供授权服务。

认证中心在客户端的cookie:
用于存放ticket的cookie。各个子应用的cookie不能在跨域的子应用之间共享,所以需要认证中心的cookie存放数据。


ticket:
认证中心生成的一个具有唯一性的标识,作为键,用来在认证中心缓存中保存登录用户的信息
同时ticket还将存放在认证中心在浏览器端的 cookie内


ticketKey:
认证中心生成的一个具有唯一性的标识,作为键,用来在认证中心缓存中保存ticket。
它是一次性的,当以ticketKey为键,从认证中心缓存中读取一次ticket后,该键将失效。
ticketKey会通过http在子应用与认证中心之间传递。


service:
通常指的是hessian service。
通过开源组件hessian发布的一种类似web service的远程服务。

serverMethod:
也是一种发布的远程服务,但调用方法是通过url调用。
可以理解为类似struts的dispatch action的实现。

就好像用下面的url访问dispatch action, 会自动执行action中的query方法一样
http://www.aaa.com/example.do?actionMethod=query


客户端浏览器、子应用、认证中心之间 就是通过各种service和serverMethod进行通讯的。




=====================================
单点登录主要流程概述:

=====================================
判断用户是否已经登录:

当前子应用的session中有用户的基本信息,同时当前子应用的全局缓存中也有该用户的基本信息。
则认为该用户已经在当前系统中登录。两个条件缺一不可。


==================================================
系统初始化流程:

1 启动认证中心(一个web应用)并进行相关的初始化(初始化filter、缓存、发布service等)
2 启动各个子应用(初始化filter、缓存、发布service等)
3 子应用通过hessian 向 认证中心 注册自己的信息(包括 子应用的url 子应用中发布的service等信息)
4 认证中心验证子应用是否有合法的key,没有合法的key,则不允许注册。
5 成功注册的子应用的信息会加入 认证中心的子应用信息列表内(一个全局缓存)
这个列表可以帮助认证中心向各个子应用来发广播,也可以用来在各个子应用间进行通讯和同步.


=====================================
登录流程
(假设登录A应用 登录的用户为 tom )

1 通过A应用的登录页面输入用户名tom 以及 密码
2 调用A应用的授权模块进行授权,授权失败返回登录页面。
3 授权成功,则将用户名 密码(加密后)通过hessian 发往 认证中心。
4 认证中心对其进行缓存,并产生ticket,将ticket和用户基本信息放入认证中心的缓存
5 同时还将生成ticketKey,以ticketKey做为键,把ticket放入认证中心端的一个临时的缓存内。
6 将ticketKey通过hessian返回给A应用。
7 A应用得到ticketKey后,通过内部redirect访问认证中心的指定url,该url用于产生cookiet
(该cookie为认证中心在客户端产生,cookiet内存放ticket)。
8 完成写cookie操作后 ,清楚临时缓存中的ticketKey和ticket。
9 以上步骤成功完成后,将在A应用session和全局缓存中放置用户的基本信息(用户名 ticket)。
此时,对于a应用来说,用户tom的状态为已登录.



=====================================
登出流程
(假设登出A应用,登出的用户为 tom )

点击登出按钮,或进行重新登录的时候,会对先前登录时产生的信息进行销毁。
1 清空A应用的session和全局缓存中放置的tom的基本信息
2 向认证中心发出tom登出的通知。
3 认证中心接收到通知后,会把该通知通过hessian广播给所有子应用(利用子应用启动时向认证中心注册的信息来实现广播)。
4 接到通知的各个子应用会清空应用的全局缓存中放置的tom的基本信息。
因为“已经登录”的前提条件是 session中和应用的全局缓存中也有该用户的基本信息,
所以这时,在所有的子应用中,tom的状态都是为登出,这样做到了各个子应用间的同步。
对于登出的处理,和cas完全不同,cas是通过消灭cookie.


=====================================
访问流程:
(登录后,在各个子应用间切换的流程比较复杂,所以最后讲.)
假设tom已经通过A应用的入口 成功登录了A应用,并且认证中心正常工作。
此时访问B应用

1 判断tom是否已经登录了B应用
(通过判断B应用的session和全局缓存中是否有该用户的基本信息)
2 如果有 说明已经登录过(访问过)B应用,则进行正常访问。
3 如果没有,即tom没有登录过B应用,则尝试去认证中心 取用户的相关信息。
过程如下:
4 redirect到认证中心的指定url(同时发送当前用户请求的地址给认证中心),并从cookie中取ticket。
(cookie不能跨域,不redirect到认证中心是取不到ticket的)。
5 如果没有取到合法的ticket,则通知B应用跳转到登录页面(或出错页面)。
6 如果取到了ticket 则生成一个一次性的ticketKey,把ticket放入一个临时缓存,并返回B应用,同时把ticketKey返回给客户端。
7 B应用根据ticketKey从认证中心取用户名 密码.
过程如下:通过hessian 把 ticketKey 传递给认证中心,认证中心根据ticketKey去取ticket。
如果取到合法的ticket,则根据 ticket 通过hessian ,从认证中心的全局缓存中取得加密的 用户名 密码。
8 完成以上操作后 ,清除临时缓存中的ticketKey和ticket。
9 使用取得的用户名 密码,调用B应用的授权模块进行授权... 过程类似登录过程,但不需要认证中心重新产生ticket。
10 授权成功则 在B应用的session和全局缓存中放置用户基本信息,然后进行正常访问。
11 授权失败返回登录页面,并通知认证中心注销该ticket和用户基本信息(可以理解为,那个ticket失效了),
注销ticket时,认证中心会根据认证中心端的子应用列表,来通知各个子应用这个ticket失效了
各个子应用会从自己的全局缓存中清楚该ticket和其对应的用户基本信息(如果存在的话),过程类似登出过程。


=====================================
关于安全问题的一些探讨:

在这个系统中最需要保护的是用户名 密码 和 ticket。由于ticketKey具有瞬时性,被盗用的意义不大。
用户名 密码 和 ticket 始终通过 hessian传递,并且加密,即使被拦截,被盗用和破解的几率也极低.
ticketKey大多数情况下是通过hessian传递,但某应用第一次去认证中心取ticketKey时,
ticketKey是通过http的url传送的(这是不能避免的,即使强大的cas也是使用的这种方式,不同的是他使用了https,
其实,此处也是CAS坚持要使用HTTPS的一个主要原因)
减少"通过http协议,由URL传递ticket"的弊端的方式有三种:
1 使用HTTPS
2 使用一次性ticketKey
3 给ticketKey提供较短的失效时间
在这里我使用了 第2种方法。基本上可以避免ticketKey被盗用。

也许有人会想,如果可以生成一个和浏览器所在机器或用户IP绑定的ticketKey是不是可以解决这个问题,
即ticketKey被盗后,如果在其他机器使用,则无效。
这种思路看起来似乎可以,但其实不然。
原因很简单,web应用不能清晰准确的识别哪些访问来自同一台机器,从而可能导致合法的用户也无法对系统进行正常的访问。


http vs. https
单点登录系统中 保护用户名 密码 用户信息的唯一标识(ticket)是首要任务。
而坏人(在这里先这么称呼吧 因为我真的不想玷污黑客这个词)最想得到的就是这三者。
为了防止用户名 密码 ticket被盗,于是大多数sso系统采用了https。
在此处 https 比 http最主要最明显的优势就是传输的数据经过加密。
使得数据封包被拦截后,也几乎不可能从中破解出传输的数据。
但是,现在的坏人,主要的窃取用户信息的手段是什么?
在网内拦截封包,然后自己破解??错了,是用最简单的木马程序。
侵入用户的机器,直接记录键盘、拦截页面表单提交....
如果一个坏人,有能力侵入网络,来拦截各个机器之间的数据封包和http请求,那么他肯定也有能力直接在客户端的机器里做些手脚。


说的可能有些凌乱,重新总结一下吧:
如果想拥有可靠的安全性,要具备下面的几点:
1 整个网络系统 有完善的防火墙(使坏人不能随意的拦截网络数据封包)
2 认证中心、子应用所在机器要拥有完善的防火墙、完善的杀毒、防毒软件。
3 客户浏览器所在机器上,要有完善的防火墙、完善的杀毒、防毒软件。(这点最难保证)
4 机器之间的数据传输使用安全的传输协议(例如https)
以上4条,如果前3条得不到保证,那么安全性就无从谈起,第4条也就无足轻重了。
而如果前3条都满足了,那么第4条即使不满足,整个系统也同样安全,第4条同样无足轻重。
只有在 第2 3 条都满足,且第1条不满足的情况下,https才有用武之地。

所以,我的观点就是,对于"非公网"的单点认证系统,https不是必须的。
它在安全性方面起到的作用,和它带来的弊端想比,往往是弊大与利。
(其实,单点登录的系统,几乎都是企业内部的、非公网的系统)

注意:以上所言,都是针对传输的数据是 登录用户名 登录用户名 和 ticket的情况,如果传输是其他数据,则另当别论。



=====================================
目前已知不足:
1 不支持https协议。(虽然不是必须的,但毕竟很多时候还是需要用到https的,所以暂且算做一个不足吧)
2 不支持"同一用户在不同子应用中使用不同口令"的情况。
3 不支持同一台计算机上用多个账号同时登录。
4 和acegi结合的接口程序还没有编写完毕。
5 没有经历过绝对严格的测试。
6 整个系统完全没有任何的日志功能(我认为目前这不是必须的,而且我还不会用log4j common-logging这类组件)
7 认证中心端的管理模块还没有编写(同样,我认为目前这也不是必须的,完善基本功能是首要任务)
8 不支持类似CAS的业务代理模式。
9 不支持认证中心端的授权(本sso组件在设计的时候就没打算实现这个功能,呵呵)
10 虽然hessian支持多种语言,但是本sso组件没有提供非java的客户端版本。

=====================================
下一步工作:
1 完成与acegi的接口编码。
2 将 加密模块、唯一标识生成模块从主体中分离出来,可以通过配置来实现不同的加密、生成算法(类似acegi的做法)。
3 将 用户信息模型从主体中分离出来,做到更好的解藕,可以根据不同的需要配置不同的用户信息模型。(但核心仍然是Map来装载数据)
4 做一个稍微好点的S3OClient,但不会太好,因为计划将acegi作为client的主要承载者
5 提供从认证中心处统一登录(也就是提供统一的登录入口)。
6 支持认证中心端的统一授权。
7 认证中心端的简单的管理程序(查看认证中心中各种缓存中的数据)

分享到:
评论

相关推荐

    统一认证单点登录系统SSO解决方案.doc

    提供一种统一身份认证的解决方案,结合互联网单点登录的思路。用户在其中注册一个单点登录账号,然后针对每个应用系统绑定一个该应用系统中原有的账号,并维护这些注册和绑定信息。绑定的过程需要单点登录管理应用...

    sharepoint2007与sina邮箱和21cn邮箱的单点登录集成

    Sharepoint server2007自带的单点登录有点像鸡肋. 首先,需要管理员在管理中心中创建登录到业务系统的用户凭证.最大的麻烦是前端用户不能自己创建登录凭证,需要额外写程式 其次,再需要写程式读取用户登录的凭证,再...

    论文研究-基于SAML与XKMS的安全单点登录认证模型的研究与实现.pdf

    针对Browser/Artifact方式进行单点登录时存在的安全性问题,设计出一种基于SAML与XKMS的安全单点登录认证模型。它采用一种结合传统PKI与XML密钥管理规范(XKMS)的统一密钥管理子层来提供密钥管理,使用XML数字签名...

    浅谈谁都能看懂的单点登录(SSO)实现方式(附源码)

    今天这篇文章将介绍SSO的一种实现方式,代码超简单,仅用来验证我的思路是否可行,具体细节请大家来完善! 二级域名的单点登录 什么是二级域名呢?例如: site1.domain.com site2.domain.com 对于二级域名的单点...

    精密单点定位(PPP)技术在像控测量中的应用研究

    介绍了精密单点定位技术,并进行基于精密单点定位技术的像控点测量试验,分析了基于...总结出了采用精密单点定位技术进行像控点测量的作业流程、精度情况和相对于常规静态相对定位的优点,为外业像控测量提出一种新思路。

    一种基于区块链的物联网架构

    基于传统互联网的物联网架构面临着数据隐私安全问题、中心服务器单点问题等,构建数据安全的生态系统是未来物联网发展面临的一个挑战,区块链技术所具备的去中心化自治、防篡改、安全性等特性为应对这一挑战提供了新...

    研究论文-智能室内定位系统研究与实现.pdf

    针对全球定位系统GPS不能提供令人满意的室内定位结果,提出一种基于空间信息模式下的室内定位技术,通过感知空间环境中的特征信息,采用一种增量式信息构建方式,结合低功耗蓝牙iBeacon以及多种传感器信息,以空间中...

    线段树(Segment Tree)

    版权声明:本文为CSDN博主「Alex_McAvoy」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文...线段树是一种二叉搜索树,其存储的是一个区间的信息,每个结点以结构体的形式去存储,每个结构体包含三个元素:

    多目标进化算法和单目标算法区别与联系

    进化算法的出现为复杂优化问题的求解提供了新的思路,由于它具有智能性、 ...给出了一种用来搜寻多峰函数所有峰值点的有效算法及评价多峰函数优化问题算 法性能的度量方法.本文的主要工作概括如下:

    基于shp数据实现obj模型的切割(模型单体化思路)

    在三维仿真的场景中,无人机影像的建模是一种快速可靠的对大场景地形三维重现的方式,但是无人机影像的建模无法对单个场景的属性进行分析,如对单个楼层、居民区进行属性分析查询。在GIS中,我们通过shp数据描述空间...

    一种基于JAVA与UNI-APP的智慧农业派工单系统(毕设&课设论文参考).pdf

    【1】该资源属于项目论文,非项目...【3】文章适合学习借鉴,为您的项目开发或写作提供专业知识介绍及思路,不推荐完全照抄。 【4】毕业设计、课程设计可参考借鉴! 重点:鼓励大家下载后仔细研读学习,多看、多思考!

    基于SaaS模式的应用集成平台的设计与开发

    在系统实现部分,通过RESTLET开源架构实现用户之间的统一认证与单点登录,完成分散在不同应用中用户资源的整合。服务集成中件间模块通过REST和SPRING开源架构完成应用集成平台上不同系统间的消息传输。页面集成模块...

    网络安全论文:浅谈一种基于WPDRRC的网络安全模型.doc

    浅谈一种基于WPDRRC的网络安全模型 随着网络信息化程度的日益加深,网络通信面临越来越多的威胁。尤其随着三网融 合及物联网技术的不断发展,网络通信安全已成为当前社会面临的新问题。在目标未受 到严重损害前,...

    单层膜ITO实现多点触摸的设计方案

    通过详细分析电容式触摸屏的结构以及电极设计,为电容式触摸屏提供了一种单层膜ITO实现多点触摸的设计方案。实际验证结果表明,在单手指触摸和两...所提出的方案为低成本电容式触摸屏提供了一种简单的设计思路及方法。

    论文研究-软件体系结构层次的结构度量研究.pdf

    提出了一种基于数据回归建模的单目视觉测距算法,其基本思路与现有的“先建模再测距”的顺序思路不同,创新性地提出了“先测距再建模”的逆向思路,首先准确标定出一些距离样本点,然后采用数据回归建模的方法建立...

    幻方课程设计程序

    奇数阶幻方比偶数阶简单一点,只有一种,而偶数阶幻方还分为单偶和双偶更为复杂。编写幻方程序要充分运用到上课所学的知识,尤其是类和对象,必须弄清楚类和对象这一节每一个知识点,才能正确的运用到程序中。其次是...

    新元煤矿破碎煤体单轴抗压强度快速测定方法研究及应用

    本文以新元煤矿为工程背景,提出了一种基于原位钻孔触探法快速测定破碎煤体UCS的方法,为构建破碎煤体单轴抗压强度现场测定方法提供了一个新的思路。首先通过优化探针直径和改进动力源,现场对破碎煤体进行原位钻孔...

    一种多功能红外图像播放软件的设计实

    实践表明,该软件在用户界面上通过鼠标控制,可实现连续显示图像、显示单点或范围内像素信息的功能。基于红外信息的特点,该软件还可以通过辅助信息标识出目标位置,并旋转图像以符合惯性坐标系下视角。该软件的开始...

    C++幻方课程设计程序

    奇数阶幻方比偶数阶简单一点,只有一种,而偶数阶幻方还分为单偶和双偶更为复杂。编写幻方程序要充分运用到上课所学的知识,尤其是类和对象,必须弄清楚类和对象这一节每一个知识点,才能正确的运用到程序中。其次是...

    电子工程师必备——九大系统电路识图宝典

    《电子工程师必备——九大...对于同一种电路功能,均给出了各种不同形式的实用电路。《电子工程师必备——九大系统电路识图宝典》可作为案前电路分析的手册典藏之用,适合于立志成为电子工程师的各级别读者学习参考。

Global site tag (gtag.js) - Google Analytics