单点登录(sso)入门
单点登录的英文名叫做Single Sign On,简称SSO。
在以前,一般我们就单系统,所有的功能都在同一个系统上。

后来,我们为了合理利用资源和降低耦合性,于是把单系统拆分成多个子系统。

比如阿里系的淘宝和天猫,很明显地我们可以知道这时两个系统,但是你在使用的时候,登陆了天猫,淘宝也会自动登陆。简单来说,单点登陆就是在多个系统中,用户只需要登陆一次,各个系统即能感知到该用户已经登陆。
单系统登陆
众所周知,HTTP是无状态的协议,这意味着服务器无法确认用户的信息。于是乎,W3C就提出了给每一个用户都发出一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie。
如果说Cookie是检查用户身上的通行证来确认用户的身份,那么Session就是通过检查服务器上的客户明细表(通行证列表)来确认用户的身份的。Session相当于在服务器中建立了一份客户明细表(通行证列表)。
因为HTTP协议是无状态的,因此Session不能依据HTTP连接来判断是否是同一个用户。于是服务器向用户浏览器发送了一个名为JessionId的Cookie,它的值是Session的id值,然后Session就可以根据Cookie来识别是否是同一个用户。
一般的单系统实现登陆功能都是以下几个步骤:
1.登陆后,将用户信息保存在Session对象中。如果在Session对象中能查到,说明已经登陆;如果在Session对象中查不到,说明没有登陆(或者已经退出登陆)。
2.注销(退出登陆)时,从Sessoin中删除用户的信息。
3.记住我,请求配合Cookie的发送。只要Session还没有失效,即使在关闭浏览器后,重新打开浏览器还能保持登陆状态。这一步骤也就是身份校验,通常使用拦截器来实现。
多系统登陆的问题与解决方法
Session共享问题
单系统登陆功能主要是用Session保存用户信息来实现的,但是多个系统就可能有多个Tomcat,而Session是依赖当前系统的Tomcat,所以系统A的Seesion和系统B的Session就存在一个共享的问题。

解决系统之间Session共享问题有以下几种方案:
1.Tomcat集群Session全局复制(集群内每个Tomcat的Session完全同步),但是这种方案会影响集群的性能,一般不建议。
2.使用反向代理服务器,将请求的IP根据Hash映射到对应的机器上,这样的话同一个IP地址的请求会一直被转发到同一台服务器上。常见的解决方案就是使用Nginx作为反向代理服务器,并使用其ip_hash负载均衡策略。这种方案可能会因为服务器承受不住高并发而宕机导致丢失大部分的Session数据,因此也不建议这么做。
3.把Session放到Redis缓存中,各个服务器读写同一个Redis缓存实现Session的共享。Redis的性能好,吞吐量大,还提供持久化到磁盘的功能,一般推荐使用这个方案。
Cookie的跨域问题
当我们请求www.yanggb.com的时候,浏览器会自动把www.yanggb.com的Cookie带过去,但是却不会把www.renj.com的Cookie带过去,这时因为域名不同导致的跨域问题。具体地说,这时浏览器的同源策略导致的问题,同源策略不允许JS访问跨域的Cookie,当发送请求的时候需要调用JS去浏览器的Cookie库中获得Cookie,这时候因为Cookie中保存有域名的属性作为识别标签,JS是拿不到非本域的Cookie的。
针对Cookie的跨域问题,主要有几种解决方案:
1.使用Token代替Session。服务端将Cookie写到客户端后,客户端对Cookie进行解析,将Token解析出来存放到SessionStroage中,此后的请求就把这个Token带上进行身份校验。
2.多个域名共享一个Session,在写入到客户端的时候设置Cookie的domian。
CAS原理
说到单点登陆的话,肯定要接触到CAS。CAS的全称是Central Authentication Service,即中心验证服务,说白了就是一个独立的认证中心。
假定现在有3个服务,一个是www.yanggb.com,一个是www.renj.com,还有一个是www.sso.com,其中的www.sso.com就是认证中心。
1.当用户想要访问www.yanggb.com受限(需要登陆)的资源的时候,www.yanggb.com发现用户没有登陆,就会重定向到www.sso.com认证中心,并将自己的地址作为参数,比如:www.sso.com?service=www.yanggb.com。
2.这时www.sso.com认证服务如果发现用户没有登陆,就会将用户引导至登陆页面。用户使用用户名和密码进行登陆之后,用户与认证中心就会建立一个全局的会话(生成Token写入到Cookie中并保存在浏览器上)。然后认证中心就可以重定向会到www.yanggb.com服务,并把Token携带过去:www.yanggb.com?token=********。
3.接着www.yanggb.com就会去www.sso.com认证中心校验这个Token是否正确,如果正确,则www.yanggb.com服务就会和用户建立局部的会话(创建Session)。
4.接下来,用户想要访问www.renj.com受限(需要登陆)的资源,www.renj.com服务发现用户并没有登陆,就会重定向到www.sso.com认证中心,同样将自己的地址作为参数:www.sso.com?service=www.renj.com。因为之前的用户与www.sso.com认证中心已经建立了全局会话,所以这次www.renj.com重定向到www.sso.com认证中心是可以带上Cookie的。认证中心根据带过来的Cookie发现已经与用户建立了全局会话了,就会重定向到www.renj.com,并把Token携带过去给www.renj.com,重定向的地址:www.renj.com?token=********。
5.最后,www.renj.com就会去www.sso.com认证中心校验这个Token是否正确,如果正确,则www.renj.com就和用户建立局部会话(创建Session)。
实际上,SSO认证中心就类似于一个中转站,这就是CAS的核心思想。
"世界上最残忍的不是逃离,而是近在咫尺却不属于自己。"
单点登录(sso)入门的更多相关文章
- cas单点登录 SSO 的实现原理
原文出处: cutesource 欢迎分享原创到伯乐头条 单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户 ...
- 单点登录 SSO 的实现原理
单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任. 单点登录在大型网站里使用 ...
- Atitit. 单点登录sso 的解决方案 总结
Atitit. 单点登录sso 的解决方案 总结 1. 系统应用场景and SSO模式选型 2 2. 系统应用的原则与要求 2 2.1. 开发快速简单::绝大部分系统来说,开发快速简单为主 2 2. ...
- 十六、【适合中小企业的.Net轻量级开源框架】EnterpriseFrameWork框架核心类库之单点登录SSO
回<[开源]EnterpriseFrameWork框架系列文章索引> EFW框架源代码下载:http://pan.baidu.com/s/1qWJjo3U 单点登录(Single Sign ...
- 单点登录SSO的实现原理
单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得 ...
- 单点登录SSO原理
最近接触了一点单点登录的知识,有一点理解,记录一下.有些问题并没有找到完美的解决方法,还需要找点已有框架来看看. 欢迎留言探讨. 1 概念 1.1 概念及理解 有一个网上广为流传的 ...
- CAS单点登录(SSO)完整教程
转:http://blog.csdn.net/frinder/article/details/7969925 CAS单点登录(SSO)完整教程(2012-02-01更新) 一.教程说明 前言 教程目的 ...
- Redis缓存实现单点登录SSO
.NET基于Redis缓存实现单点登录SSO的解决方案 .NET基于Redis缓存实现单点登录SSO的解决方案 一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单 ...
- 单点登录SSO原则的实现
单点登录SSO(Single Sign On)简单地把它是下一个在多系统环境中共存,在用户登录,不要在其他系统上的登录.这是用户第一次登录得到所有其他系统的信任. 单点登录在一个大型网站非常频繁使用, ...
- cas 单点登录(SSO)实验之二: cas-client
cas 单点登录(SSO)实验之二: cas-client 参考文章: http://my.oschina.net/indestiny/blog/200768#comments http://wenk ...
随机推荐
- AD的故事继续在Sharepoint里续演
本以为AD的开发深入工作,可能暂时先放放了,这不最近又一次接触了SP的知识领域,又一次见到了久违相识的老朋友AD域控了,让我没有想到其实服务器这块儿微软的份额这么大...不得不深思微软的核心业务是啥, ...
- jquery源码问题
最近公司升级jquery版本后,原来项目中复选框的attr的使用失效,在查看了jquery的内容的时候发现版本更新,复选框的attr的使用替换成了prop,所以使用的时候出现了问题,但是涉及到的文件太 ...
- SAP S4HANA 使用BP创建供应商报错 - You cannot create a vendor with grouping G001 - 对策
SAP S4HANA 使用BP创建供应商报错 - You cannot create a vendor with grouping G001 - 对策 上午收到客户财务部门的用户提出的一个紧急的问题, ...
- Fundebug后端Node.js插件更新至0.2.0,支持监控Express慢请求
摘要: 性能问题也是BUG,也需要监控. Fundebug后端Node.js异常监控服务 Fundebug是专业的应用异常监控平台,我们Node.js插件fundebug-nodejs可以提供全方位的 ...
- 困扰了2天的问题,终于解决了。VB6的MSComCtl.ocx在32位Win7显示对象库未注册
解决方案在这里,中文的资料真的挺垃圾的.(重启几次之后又不行了....怎么回事???) 安装.net framework4.0以上版本, C:\Windows\System32, C:\Windows ...
- k8s volume存储卷(四)
介绍 volume存储卷是Pod中能够被多个容器访问的共享目录,kubernetes的volume概念,用途和目的与docker的volume比较类似,但两者不能等价,首先,kubernetes中的v ...
- @RequestMapping和@GetMapping和PostMapping
简介 - @GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写.该注解将HTTP Get 映射到 特定的处理方法上. - ...
- windows10下Bad owner or permissions on .ssh/config的解决办法
方法很简单,亲测有效. 1.进入如下路径C:\Users\用户名\.ssh,你会看到有config这个文件 2.右击config,属性→安全→高级→禁止继承→删除所有继承(忘了全称了,大概这个意思)→ ...
- Spring Cloud微服务安全实战_3-6_API安全机制之审计
审计日志 定义:谁,在什么时间,干了什么事. 位置:认证之后,授权之前. 这样就知道是谁在访问,拒绝掉的访问也能被记录.如果放在认证之前,那么就不知道是谁在访问:如果放在授权之后,就没办法记录被拒绝的 ...
- uuid模块
UUID即通用唯一标识符,对于所有的UUID它可以保证在空间和时间上的唯一性.它是通过MAC地址.时间戳.命名空间.随机数.伪随机数来保证生成ID的唯一性,有着固定的大小(128 bit).它的唯一性 ...