单点登录SSO

会话session

几乎每个系统都有一个登录的地方。
系统为什么需要用户登录呢?
是为了识别用户,识别用户之后,就可以给用户浏览相关页面的权利,也可以追踪用户的行为路径等。而识别不出来的用户,就可以当做非法用户,限制访问某些资源。

我们在访问页面时,使用最多的协议就是http协议,w3c为了该协议的效率和其他一些原因,把http协议设计成了一种无状态的协议。
什么是无状态?
就是http的BS模型,请求-响应模型。浏览器发送http请求,服务器响应之后,这个过程就完结了。你第二次发起http请求,就跟前一次的http请求毫无瓜葛了,是一个全新的http请求。

为了能够从不同的请求中识别用户,怎么办?
给用户加一个标识啊,对,你说的没错。
让用户每次请求的时候都加上一个标识,这个标识就是用来识别用户的。

最开始加的一个标识叫 session,会话。那把session放置在http协议的哪一部分呢?放在http协议的请求头,请求头有一个叫Cookie的字段。这个字段是浏览器存储少量数据的一种机制。数据是以key:value形式存放的。session就是存放在这个字段中的。

单系统登录

http每一次请求的时候都会带上这个字段,服务端获取这个字段的值,用这个值来进行用户的认证。
用户用用户名和密码进行登录,然后与数据库存储的值进行比对,正确的话说明当前持有这个会话的用户是合法用户,然后给这个用户会话标记为“已登录”状态。 然后登出的时候在进行注销。当然也会给一个会话时间,基于安全方面考虑。

image.png

上面这个是单系统登录。

如果业务发展的很快,又出现了其他的业务系统,其他业务系统也需要登录系统。那么是让用户在每一个系统都登录一次,才能进行相关操作,还是让用户只登录一次,其他系统无需等都能通行,并进行相关操作。
当然是后一种用户体验更佳,那么多系统登录的需求就应运而生了。

多系统登录

单系统登录使用的是cookie,但是出于安全方面的考虑,浏览器对cookie有限制,这个限制就是cookie的域(通常对应网站的域名),浏览器发送http请求时会自动携带与该域匹配的cookie,而不是所有cookie.
实际上早期很多多系统登录就是采用同域名共享cookie的方式,这样就携带了所有域名的cookie。

然而这种共享cookie方式有缺点:
1.首先,应用群域名得统一;
2.其次,应用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间;
3.cookie本身不安全。

还有一种就是令牌ticket验证,这种需要一个SSO的验证中心。
实现步骤:

1、 用户访问某个子系统,如果发现未登录,则引导用户跳转到SSO登录页面
2、 在SSO验证中心判断用户是否已经登录
3、 如果已经登录,直接跳转到回调地址,并返回认证的ticket
4、 如果未登录,调用SSO认证获取用户uid等信息,成功后让用户登录,并返回ticket。

这个是不是有点像电影院看电影检票过程,你要看电影,先要去买电影票(票据ticket),然后去检票口检票(SSO检票中心),认证通过是这场电影的票,就让你进去,认证不通过,就不会让你进去,让你重新买票或去别的场。

单点登录sso

SSO是啥:Single Sign On ,英文单点登录的简称。就是多个系统,只在一个地方登录一个地方退出。
SSO需要一个认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现。SSO认证中心验证了用户的用户名和密码没问题,创建授权令牌,在跳转过程中,授权令牌作为参数下发给各个子系统,子系统拿到令牌,及是得到了授权,可以创建局部会话,局部会话登录方式和单系统登录方式相同。

image.png
图片来源: https://www.cnblogs.com/ywlaker/p/6113927.html(文章有详尽的介绍,写的很好,引用它的了)
下面对上图简要描述:
上面描叙了用户登录2个系统,分别登录系统1和系统2,

先在系统1进行登录:

1、用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数
2、 sso认证中心发现用户未登录,将用户引导至登录页面
3、用户输入用户名密码提交登录申请
4、sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话,同时创建授权令牌
5、sso认证中心带着令牌跳转会最初的请求地址(系统1)
6、系统1拿到令牌,去sso认证中心校验令牌是否有效
7、sso认证中心校验令牌,返回有效,注册系统1
8、 系统1使用该令牌创建与用户的会话,称为局部会话,返回受保护资源

后来用户想到系统2访问并进行相关操作:

1、 用户访问系统2的受保护资源
2、 系统2发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数
3、 sso认证中心发现用户已登录,跳转回系统2的地址,并附上令牌
4、 系统2拿到令牌,去sso认证中心校验令牌是否有效
5、 sso认证中心校验令牌,返回有效,注册系统2
6、系统2使用该令牌创建与用户的局部会话,返回受保护资源

  用户登录成功之后,会与sso认证中心及各个子系统建立会话,用户与sso认证中心建立的会话称为全局会话,用户与各个子系统建立的会话称为局部会话,局部会话建立之后,用户访问子系统受保护资源将不再通过sso认证中心,全局会话与局部会话有如下约束关系

1、局部会话存在,全局会话一定存在
2、 全局会话存在,局部会话不一定存在
3、 全局会话销毁,局部会话必须销毁

注销

单点登录自然也要单点注销,在一个子系统中注销,所有子系统的会话都将被销毁,用下面的图来说明
image.png

 sso认证中心一直监听全局会话的状态,一旦全局会话销毁,监听器将通知所有注册系统执行注销操作
  下面对上图简要说明

1、用户向系统1发起注销请求
2、系统1根据用户与系统1建立的会话id拿到令牌,向sso认证中心发起注销请求
3、 sso认证中心校验令牌有效,销毁全局会话,同时取出所有用此令牌注册的系统地址
4、 sso认证中心向所有注册系统发起注销请求
5、 各注册系统接收sso认证中心的注销请求,销毁局部会话
6、 sso认证中心引导用户至登录页面

参考:https://www.cnblogs.com/ywlaker/p/6113927.html

原文地址:https://www.cnblogs.com/jiujuan/p/11701653.html