熬夜冠军,为你整理单点登录体系架构,跟着学,还怕什么学不会吗

今天的干货有点湿,里面夹杂着我的泪水。可能也只有代码才能让我暂时的平静。

不知道大家平时在学习的时候,拿到一份资料,有没有先看一下目录的习惯,今天也不是看书,就是单纯的经验分享,那么,咱也不整那个花里胡哨的目录了,简单直白点,直接一套思维导图奉上,清晰明了,(个人建议大家在平时的学习中也可以去整理类似的架构图,梳理一下自己的知识)

简介

单点登录英文全称Single Sign On,简称就是SSO。它的解释是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。

常见的应用有两种情况:

  • 在一个单位中,需要使用多个功能不同的系统应用,比如企业会有专门的财务系统,销售的CRM系统,人事的OA、邮箱系统,如果每个系统都用独立的账号认证体系,会给员工带来很大困扰,同时不方便管理。所以需要设计一种统一登录的解决方案。
  • 现在是App爆炸的时代,如果每个App都需要独立的登陆账号和密码,肯定不方便用户管理,所以需要设计一种可多平台授权登陆的解决方法,比如:我登陆淘宝时使用支付宝授权认证登陆,使用微博时使用微信授权登陆。

如图所示,图中有4个系统,分别是Application1、Application2、Application3、和SSO。Application1、Application2、Application3没有登录模块,而SSO只有登录模块,没有其他的业务模块,当Application1、Application2、Application3需要登录时,强调到SSO系统,SSO系统完成登录,其他的应用系统也就随之登录了。这完全符合我们对单点登录(SSO)的定义。

 SSO 原理

SSO 体系中的角色

一般 SSO 体系主要角色有三种:

扫描二维码关注公众号,回复: 11181541 查看本文章

1、 User (多个)

2、 Web 应用(多个)

3、 SSO 认证中心( **1 个 **)

SSO 实现模式的原则

SSO 实现模式一般包括以下三个原则:

1、 所有的认证登录都在 SSO 认证中心进行;

2、 SSO 认证中心通过一些方法来告诉 Web 应用当前访问用户究竟是不是已通过认证的用户;

3、 SSO 认证中心和所有的 Web 应用建立一种信任关系,也就是说 web 应用必须信任认证中心。(单点信任)

SSO 主要实现方式

SSO 的主要实现方式有:

1、 共享 cookies

基 于共享同域的 cookie 是 Web 刚开始阶段时使用的一种方式,它利用浏览器域名之间自动传递 cookies 机制,实现两个域名之间系统令牌 传递问题;另外,关于跨域问题,虽然 cookies本身不跨域,但可以利用它实现跨域的 SSO 。如:代理、暴露 SSO 令牌值等。

缺点:不灵活而且有不少安全隐患,已经被抛弃。

2、 Broker-based( 基于经纪人 )

这 种技术的特点就是,有一个集中的认证和用户帐号管理的服务器。经纪人给被用于进一步请求的电子身份存取。中央数据库的使用减少了管理的代价,并为认证提供 一个公共和独立的 "第三方 " 。例如 Kerberos 、 Sesame 、 IBM KryptoKnight (凭证库思想 ) 等。 Kerberos是由麻省理工大学发明的安全认证服务,已经被 UNIX 和 Windows 作为 默认的安全认证服务集成进操作系统。

3、 Agent-based (基于代理人)

在 这种解决方案中,有一个自动地为不同的应用程序认证用户身份的代理程序。这个代理程序需要设计有不同的功能。比如,它可以使用口令表或加密密钥来自动地将 认证的负担从用户移开。代理人被放在服务器上面,在服务器的认证系统和客户端认证方法之间充当一个 " 翻译 "。例如 SSH 等。

4、 Token-based

例如 SecureID,WebID ,现在被广泛使用的口令认证,比如 FTP 、邮件服务器的登录认证,这是一种简单易用的方式,实现一个口令在多种应用当中使用。

5、 基于网关

6、 基于 SAML

SAML(Security Assertion Markup Language ,安全断言标记语言)的出现大大简化了 SSO ,并被 OASIS 批准为 **SSO 的执行标准 **。开源组织 OpenSAML 实现了 SAML 规范

技术实现

在说单点登录(SSO)的技术实现之前,我们先说一说普通的登录认证机制。

如上图所示,我们在浏览器(Browser)中访问一个应用,这个应用需要登录,我们填写完用户名和密码后,完成登录认证。这时,我们在这个用户的session中标记登录状态为yes(已登录),同时在浏览器(Browser)中写入Cookie,这个Cookie是这个用户的唯一标识。下次我们再访问这个应用的时候,请求中会带上这个Cookie,服务端会根据这个Cookie找到对应的session,通过session来判断这个用户是否登录。如果不做特殊配置,这个Cookie的名字叫做jsessionid,值在服务端(server)是唯一的。

同域下的单点登录

一个企业一般情况下只有一个域名,通过二级域名区分不同的系统。比如我们有个域名叫做:a.com,同时有两个业务系统分别为:app1.a.com和app2.a.com。我们要做单点登录(SSO),需要一个登录系统,叫做:sso.a.com。

我们只要在sso.a.com登录,app1.a.com和app2.a.com就也登录了。通过上面的登陆认证机制,我们可以知道,在sso.a.com中登录了,其实是在sso.a.com的服务端的session中记录了登录状态,同时在浏览器端(Browser)的sso.a.com下写入了Cookie。那么我们怎么才能让app1.a.com和app2.a.com登录呢?这里有两个问题:

  • Cookie是不能跨域的,我们Cookie的domain属性是sso.a.com,在给app1.a.com和app2.a.com发送请求是带不上的。
  • sso、app1和app2是不同的应用,它们的session存在自己的应用内,是不共享的。

那么我们如何解决这两个问题呢?针对第一个问题,sso登录以后,可以将Cookie的域设置为顶域,即.a.com,这样所有子域的系统都可以访问到顶域的Cookie。我们在设置Cookie时,只能设置顶域和自己的域,不能设置其他的域。比如:我们不能在自己的系统中给baidu.com的域设置Cookie。

Cookie的问题解决了,我们再来看看session的问题。我们在sso系统登录了,这时再访问app1,Cookie也带到了app1的服务端(Server),app1的服务端怎么找到这个Cookie对应的Session呢?这里就要把3个系统的Session共享,如图所示。共享Session的解决方案有很多,例如:Spring-Session。这样第2个问题也解决了。

同域下的单点登录就实现了,但这还不是真正的单点登录。

不同域下的单点登录

同域下的单点登录是巧用了Cookie顶域的特性。如果是不同域呢?不同域之间Cookie是不共享的,怎么办?

这里我们就要说一说CAS流程了,这个流程是单点登录的标准流程。

上图是CAS官网上的标准流程,具体流程如下:

  1. 用户访问app系统,app系统是需要登录的,但用户现在没有登录。
  2. 跳转到CAS server,即SSO登录系统,以后图中的CAS Server我们统一叫做SSO系统。 SSO系统也没有登录,弹出用户登录页。
  3. 用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器(Browser)中写入SSO域下的Cookie。
  4. SSO系统登录完成后会生成一个ST(Service Ticket),然后跳转到app系统,同时将ST作为参数传递给app系统。
  5. app系统拿到ST后,从后台向SSO发送请求,验证ST是否有效。
  6. 验证通过后,app系统将登录状态写入session并设置app域下的Cookie。

至此,跨域单点登录就完成了。以后我们再访问app系统时,app就是登录的。接下来,我们再看看访问app2系统时的流程。

  1. 用户访问app2系统,app2系统没有登录,跳转到SSO。
  2. 由于SSO已经登录了,不需要重新登录认证。
  3. SSO生成ST,浏览器跳转到app2系统,并将ST作为参数传递给app2。
  4. app2拿到ST,后台访问SSO,验证ST是否有效。
  5. 验证成功后,app2将登录状态写入session,并在app2域下写入Cookie。

这样,app2系统不需要走登录流程,就已经是登录了。SSO,app和app2在不同的域,它们之间的session不共享也是没问题的。

有的同学问我,SSO系统登录后,跳回原业务系统时,带了个参数ST,业务系统还要拿ST再次访问SSO进行验证,觉得这个步骤有点多余。他想SSO登录认证通过后,通过回调地址将用户信息返回给原业务系统,原业务系统直接设置登录状态,这样流程简单,也完成了登录,不是很好吗?

其实这样问题是很严重的,如果我在SSO没有登录,而是直接在浏览器中敲入回调的地址,并带上伪造的用户信息,是不是业务系统也认为登录了呢?这是很可怕的。

总结

单点登录(SSO)的所有流程都介绍完了,原理大家都清楚了。总结一下单点登录要做的事情:

  • 单点登录(SSO系统)是保障各业务系统的用户资源的安全 。
  • 各个业务系统获得的信息是,这个用户能不能访问我的资源。
  • 单点登录,资源都在各个业务系统这边,不在SSO那一方。 用户在给SSO服务器提供了用户名密码后,作为业务系统并不知道这件事。 SSO随便给业务系统一个ST,那么业务系统是不能确定这个ST是用户伪造的,还是真的有效,所以要拿着这个ST去SSO服务器再问一下,这个用户给我的ST是否有效,是有效的我才能让这个用户访问。

好了,今天的单点登录的内容基本整理完了,不知道大家对这种整理文档的方式感觉怎么样,觉得还不错的,欢迎下方评论一波666,有什么建议也可以提出来帮助小编成长,谢谢


单点登陆是结束了,但是,其延申出来的相应的技术点,可是非常庞大的,可以算是一整套体系,不知道大家在平时的工作中有没有遇到过这样的一种困惑,很多技术,明明在自己的脑子里组织的挺好的, ,真的实际操作了,发现好像这个也不是很清楚,那个也不是很明白,但是却记得自己会这个技术并且做过项目。

如果这个时候身边有一本说明书或者体系参考,是不是就不会那么慌乱,不知道怎么整呢?这也是我在一开始的时候为什么建议大家能整一下架构体系的原因,不信,单点论证

1、面试的时候:

当面试官问你某一个问题的时候,当你回答道回答不下去的时候,你是不是可以转化一些思维,从一个点,结合一些项目应用扩展一下说出去,哪怕这个项目技术点你没用过,只要你能说明白,谁又会去拆穿你(个人遇到的是这样的),而且,这样也可以跟面试官提示一下,你的技术思维是很广的,对不

2、面试前的准备

如果你平时的时候就是按照一套学习体系进行学习的话,并且你整理了这样的一份技术路线,当你在次需要准备面试的时候,想一下,你的技术点的准备工作可以帮你节省多少时间,回顾一下你的技术路线即可,甚至,在你去面试的路上,一个pad,就可以让你再次准备一下这些知识点的回顾工作,那你面试的时候还会很紧张吗?

3、日常工作

无论是crud还是高级架构师,无论是java还是大数据,其实我们都知道,我们在工作的时候,一个功能模块,从来都不是一个单纯的技术就可以解决的,而是一整套技术体系之间的结合,那如果说在进行技术选型或者后期研发的过程中,你可以调理的和boss说一下你的方案,或者你的工作完成效率比别人高,会是一个什么样的场景呢?甚至说远一点,架构师的工作简单点说不就是做技术选型嘛?那技术选型最底层不就是对这些技术的应用以及技术之间的链接可以解决什么问题的一个理解和认知啊,对吧

不知道我说的对与不对呢?只不过这个事情真的是很费时间 和精力,但是每天积累一点,相信很快就能见到效果的,加油吧,攻城狮们

我跟大家也分享一下我整理的一些思维导图,希望对大家能有所帮助,篇幅原因,只展示一部分。需要的朋友

关注公众号:Java架构师联盟 每日更新技术好文

原创文章 134 获赞 66 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42864905/article/details/106089418
今日推荐