sso单点登录系统实现原理(oauth2 单点登录原理)

单点登录SSO(SingleSignOn)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉。实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效性,因

大家好,又见面了,我是你们的朋友全栈君。

单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉。实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效性,因此要点也就以下几个:

  • 存储信任
  • 验证信任

只要解决了以上的问题,达到了开头讲得效果就可以说是SSO。最简单实现SSO的方法就是用Cookie,实现流程如下所示:

sso单点登录系统实现原理(oauth2 单点登录原理)

不然发现以上的方案是把信任存储在客户端的Cookie里,这种方法虽然实现方便但立马会让人质疑两个问题:

  • Cookie不安全
  • 不能跨域免登

对于第一个问题一般都是通过加密Cookie来处理,第二个问题是硬伤,其实这种方案的思路的就是要把这个信任关系存储在客户端,要实现这个也不一定只能用Cookie,用flash也能解决,flash的Shared Object API就提供了存储能力。

一般说来,大型系统会采取在服务端存储信任关系的做法,实现流程如下所示:

sso单点登录系统实现原理(oauth2 单点登录原理)

以上方案就是要把信任关系存储在单独的SSO系统(暂且这么称呼它)里,说起来只是简单地从客户端移到了服务端,但其中几个问题需要重点解决:

  • 如何高效存储大量临时性的信任数据
  • 如何防止信息传递过程被篡改
  • 如何让SSO系统信任登录系统和免登系统

对于第一个问题,一般可以采用类似与memcached的分布式缓存的方案,既能提供可扩展数据量的机制,也能提供高效访问。对于第二个问题,一般采取数字签名的方法,要么通过数字证书签名,要么通过像md5的方式,这就需要SSO系统返回免登URL的时候对需验证的参数进行md5加密,并带上token一起返回,最后需免登的系统进行验证信任关系的时候,需把这个token传给SSO系统,SSO系统通过对token的验证就可以辨别信息是否被改过。对于最后一个问题,可以通过白名单来处理,说简单点只有在白名单上的系统才能请求生产信任关系,同理只有在白名单上的系统才能被免登录。

以上只是提供了些简单的实现技术,但需要强调的是这只是技术实现而已,仅仅是为了解决上面谈到的一些问题,SSO本身来说并不是什么高科技,有了这个认识比较有利于我们深入探索SSO

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129703.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 解决Linux TIME_WAIT过多造成的问题[通俗易懂]

    解决Linux TIME_WAIT过多造成的问题[通俗易懂]1、time_wait的作用:TIME_WAIT状态存在的理由:1)可靠地实现TCP全双工连接的终止在进行关闭连接四次挥手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器将重发最终的FIN,因此客户端必须维护状态信息允许它重发最终的ACK。如果不维持这个状态信息,那么客户端将响应RST分节,服务器将此分节解释成一个错误(在java中会抛出co…

    2022年6月10日
  • 面试题,说说你对spring IOC和AOP的理解

    面试题,说说你对spring IOC和AOP的理解https://blog.csdn.net/s20081294/article/details/44677387在面试中,经常会问,说说你对springIOC和AOP的理解,问题很宽泛,似乎不知道从何说起。回答思路:1.先用通俗易懂的话解释下何为IOC和AOP———》2.各自的实现原理———–》3.自己的项目中如何使用以下是个人的一些总结,仅供参考。1.IOC…

    2022年6月16日
  • sed文本处理工具

    sed文本处理工具

    2022年3月13日
  • Vue轻量级富文本编辑器-Vue-Quill-Editor

    Vue轻量级富文本编辑器-Vue-Quill-Editor先看效果图:女神镇楼下载Vue-Quill-Editor npminstallvue-quill-editor–save 下载quill(Vue-Quill-Editor需要依赖) npminstallquill–save 代码 <template>…

    2022年5月2日
  • 磁盘分区类型和分区表的区别[通俗易懂]

    磁盘分区类型和分区表的区别[通俗易懂]任务1罗列磁盘分区的类型并做比较性介绍分类:FAT16、FAT32、NTFS、EXT2、EXT3、EXT4FAT16:磁盘分区最大只能到2GB、使用簇的大小不恰当、FAT16使用了16位的空间来表示每个扇区文件名长度有限制FAT32:相比FAT16会拥有更多的簇,更大空间容量上限为16TB根目录区(ROOT区)不再是固定区域、固定大小速度和FAT16一样快,对大磁盘利用率比FAT16好文件名长度有限制NTFS:备3个功能:错误预警功能、磁盘自我修复功能和日志功能安全性,

    2022年8月11日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号