(转)《SSO CAS单点系列》之 实现一个SSO认证服务器是这样的!
上篇我们引入了SSO这个话题《15分钟了解SSO是个什么鬼!》。本篇我们一步步深入分析SSO实现机理,并亲自动手实现一个线上可用的SSO认证服务器!
首先,我们来分析下单Web应用系统登录登出的实现机理。Web系统登录登出功能,通常属于系统安全管理模块的一部分。如上篇所说,登录,意味着用户与系统之间的一次会话开始,登出,意味着本次会话的结束。
下图列出整个登录登出会话过程中,用户与系统之间的HTTP交互过程:
如图,服务器内部又做了哪些工作呢?
通常服务端在用户登录请求到来时(圈1),会先做认证(Authentication)操作,就是证明这个浏览器请求用户是合法系统用户,一般情况就是验证用户名和密码。
认证通过后,系统紧接着给这个合法用户授权(Authorization),就是根据该用户在此系统中的权限定义,绑定正确的权限信息,为用户后续正确使用系统功能提供安全保障。
最后建立会话,这个可以基于服务器容器提供的Session机制或自己基于Cookie开发的类似功能,建立起本次会话。
登录成功后,当浏览器后续请求来时(圈2),服务器需进行登录状态判断,即判别是否处于会话状态,从而识别操作是否是本次登录用户的操作。
登出时,服务端取消会话,本次登录用户会话结束。下次请求时,系统即判断是非登录用户。
上面分析了单Web应用登录登出实现机理。那对于多系统的SSO,该如何实现呢?我们先分析下基本实现思路。
有上面分析可知,单Web应用登录,主要涉及到认证、授权、会话建立、取消会话等几个关键环节。推广到多系统,每个系统也会涉及到认证、授权、会话建立取消等工作。那我们能不能把每个系统的认证工作抽象出来,放到单独的服务应用中取处理,是不是就能解决单点登录问题?
思考方向是正确的,我们把这个统一处理认证服务的应用叫认证中心。当用户访问子系统需要登录时,我们把它引到认证中心,让用户到认证中心去登录认证,认证通过后返回并告知系统用户已登录。当用户再访问另一系统应用时,我们同样引导到认证中心,发现已经登录过,即返回并告知该用户已登录
由上图可以看出,原先在各系统中的认证模块,已经剥离出来放到独立的认证中心中去执行。至于授权,每个应用都不一样,可维持原样。会话部分,其实分解成了全局会话和局部会话,这个后面再详细解释。
思路是有了,但真正实现这一认证服务器我们还得要具体解决几个关键问题
一、登录信息传递问题
应用系统将登录请求转给认证中心,这个很好解决,我们一个HTTP重定向即可实现。现在的问题是,用户在认证中心登录后,认证中心如何将消息转回给该系统?
这是在单web系统中不存在的问题。我们知道HTTP协议传递消息只能通过请求参数方式或cookie方式,cookie跨域问题不能解决,我们只能通过URL请求参数。
我们可以将认证通过消息做成一个令牌(token)再利用HTTP重定向传递给应用系统。但现在的关键是:该系统如何判断这个令牌的真伪?如果判断这个令牌确实是由认证中心发出的,且是有效的?
我们还需要应用系统和认证中心之间再来个直接通信,来验证这个令牌确实是认证中心发出的,且是有效的。由于应用系统和认证中心是属于服务端之间的通信,不经过用户浏览器,相对是安全的。
用户首次登录时流程如下:
1.用户浏览器访问系统A需登录受限资源。
2.系统A发现该请求需要登录,将请求重定向到认证中心,进行登录。
3.认证中心呈现登录页面,用户登录,登录成功后,认证中心重定向请求到系统A,并附上认证通过令牌。
4.系统A与认证中心通信,验证令牌有效,证明用户已登录。
5.系统A将受限资源返给用户。
已登录用户首次访问应用群中系统B时:
浏览器访问另一应用B需登录受限资源。
系统B发现该请求需要登录,将请求重定向到认证中心,进行登录。
认证中心发现已经登录,即重定向请求响应到系统B,附带上认证令牌。
系统B与认证中心通信,验证令牌有效,证明用户已登录。
- 系统B将受限资源返回给客户端。
二、登录状态判断问题
用户到认证中心登录后,用户和认证中心之间建立起了会话,我们把这个会话称为全局会话。当用户后续访问系统应用时,我们不可能每次应用请求都到认证中心去判定是否登录,这样效率非常低下,这也是单Web应用不需要考虑的。
我们可以在系统应用和用户浏览器之间建立起局部会话,局部会话保持了客户端与该系统应用的登录状态,局部会话依附于全局会话存在,全局会话消失,局部会话必须消失。
用户访问应用时,首先判断局部会话是否存在,如存在,即认为是登录状态,无需再到认证中心去判断。如不存在,就重定向到认证中心判断全局会话是否存在,如存在,按1提到的方式通知该应用,该应用与客户端就建立起它们之间局部会话,下次请求该应用,就不去认证中心验证了。
三、登出问题
用户在一个系统登出了,访问其它子系统,也应该是登出状态。要想做到这一点,应用除结束本地局部会话外,还应该通知认证中心该用户登出。
认证中心接到登出通知,即可结束全局会话,同时需要通知所有已建立局部会话的子系统,将它们的局部会话销毁。这样,用户访问其它应用时,都显示已登出状态。
整个登出流程如下:
1.客户端向应用A发送登出Logout请求。
2.应用A取消本地会话,同时通知认证中心,用户已登出。
3.应用A返回客户端登出请求。
4.认证中心通知所有用户登录访问的应用,用户已登出。
到此,我们完整介绍了实现一个SSO认证服务器的基本思路方法,后面我们就按照这个方法,自己动手利用Java一步步实现一个SSO认证服务器。
作者: 手插口袋_
链接:http://www.imooc.com/article/3558
来源:慕课网
(转)《SSO CAS单点系列》之 实现一个SSO认证服务器是这样的!的更多相关文章
- (转)《SSO CAS单点系列》之 15分钟让你了解SSO技术到底是个什么鬼!
Web应用系统的演化总是从简单到复杂,从单功能到多功能模块再到多子系统方向发展. .当前的大中型Web互联网应用基本都是多系统组成的应用群,由多个web系统协同为用户提供服务. 多系统应用群,必然意味 ...
- SSO CAS 单点系列
在多系统应用群中,使用,例如,用户账户管理,用户应该有一个统一的账户,不应该让用户在每个子系统分别注册 登陆再分别登出.这就是我们所说的单点登陆问题,即SSO: SSO问题,时大中型web应用经常碰到 ...
- 《SSO CAS单点系列》之 APP原生应用如何访问CAS认证中心
4.开发支持APP登录的移动服务端接口.接收APP登录请求,采用HttpClient转发至CAS认证中心登录,返回json数据解析并最终返回给客户端.本地会话采用redis维护,登录成功,返回acce ...
- 【Java EE 学习 68】【单点登录】【两种单点登录类型:SSO/CAS、相同一级域名的SSO】
单点登录:SSO(Single Sign On) 什么是单点登录:大白话就是多个网站共享一个用户名和密码的技术,对于普通用户来说,只需要登录其中任意一个网站,登录其他网站的时候就能够自动登陆,不需要再 ...
- 【单点登录】【两种单点登录类型:SSO/CAS、相同一级域名的SSO】
单点登录:SSO(Single Sign On) 什么是单点登录:大白话就是多个网站共享一个用户名和密码的技术,对于普通用户来说,只需要登录其中任意一个网站,登录其他网站的时候就能够自动登陆,不需要再 ...
- 单点登录(两种单点登录类型:SSO/CAS、相同一级域名的SSO)
单点登录:SSO(Single Sign On) 什么是单点登录:大白话就是多个网站共享一个用户名和密码的技术,对于普通用户来说,只需要登录其中任意一个网站,登录其他网站的时候就能够自动登陆,不需要再 ...
- CAS单点登录(一)——初识SSO
转载:https://blog.csdn.net/Anumbrella/article/details/80821486 一.初识CAS 首先我们来说一下CAS,CAS全称为Central Authe ...
- SSO(单点登录)
自己动手写SSO(单点登录) 标签: sso 登录 | 发表时间:2014-03-02 15:01 | 作者: 分享到: 出处:http://www.iteye.com SSO在我们的应用中非常常见, ...
- cas 单点登录(SSO)之中的一个: jasig cas-server 安装
cas 单点登录(SSO)实验之中的一个: jasig cas-server 安装 參考文章: http://my.oschina.net/indestiny/blog/200768#comments ...
随机推荐
- 【Windows】win10应用商店被删后恢复方法!
以管理员身份运行PowerShell,输入以下命令后回车(可直接复制粘贴): Get-AppxPackage -AllUsers| Foreach {Add-AppxPackage -DisableD ...
- 【观点】“马云:金融是要为外行人服务",这个观点其实并不新鲜
不久前,马云在外滩国际金融峰会演讲,称金融行业需要“搅局者”.他说:“今天的金融,确实做得不错,没有今天这样的金融机构,中国的经济30年来不可能发展到今天,但是靠今天银行的机制,我不相信能支撑30年以 ...
- orcale_proceduie_function_两三栗
--获取部门树 procedure: create or replace procedure P_UTIL_TREE_ALL(P_APPL_NAME in VARCHAR2, P_HIERARCHY_ ...
- 一、SDWebImage分析--库处理流程分析
二.SDWebImage分析--源码具体分析 这阵子看了SDWebImage的实现跟源代码.也看了下网上的一些总结. 这里我自己画了个流程图来辅助理解下SDWebImage这个库的实现流程.相信也是有 ...
- day07<面向对象+>
面向对象(构造方法Constructor概述和格式) 面向对象(构造方法的重载及注意事项) 面向对象(给成员变量赋值的两种方式的区别) 面向对象(学生类的代码及测试) 面向对象(手机类的代码及测试) ...
- php 获取图片base64编码格式数据
$image_file = '1.jpg'; $image_info = getimagesize($image_file); $base64_image_content = "data:{ ...
- __declspec的用法
__declspec用于指定所给定类型的实例与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI规范,而__declspec是一种扩展 ...
- js如何判断不同的操作系统
<html> <head> <title>判断操作系统</title> <script type="text/javascript&qu ...
- RegisterHotKey注册快捷键
RegisterHotKey的具体使用方使用方法如下: BOOL RegisterHotKey( HWND hWnd, //响应该热键的窗口句柄 Int id, ...
- 微信开放平台全网发布时,检测失败 —— C#
主要就是三个:返回API文本消息,返回普通文本消息,发送事件消息 --会出现失败的情况 (后续补充说明:出现检测出错,不一定是代码出现了问题,也有可能是1.微信方面检测时出现服务器请求失败,2.我 ...