• 单点登录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

  • 相关阅读:
    Spring Boot学习(三)解析 Spring Boot 项目
    Spring Boot学习(二)搭建一个简易的Spring Boot工程
    Spring Boot学习(一)初识Spring Boot
    Spring学习(十)Spring知识点汇总
    Oracle学习(十六)Oracle安装
    Spring学习(九)Spring 和数据库编程【了解】
    Spring学习(八)AOP详解
    Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】
    Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】
    Spring学习(五)bean装配详解之 【XML方式配置】
  • 原文地址:https://www.cnblogs.com/jiujuan/p/11701653.html
Copyright © 2020-2023  润新知