精华内容
下载资源
问答
  • 什么是单点登录单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群 中登录一个系统,便可在其他所有系统中得到授权而无需再次登录
  • CAS整合LDAP实现单点登录原理及部署学习笔记,cas实现单点登录,ldap负责账户管理
  • 单点登录原理

    千次阅读 2019-03-09 21:40:26
    一、系统登录机制 1、http无状态协议  web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次...

    一、单系统登录机制

    1、http无状态协议
      web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系(解释: 主要就是因为http是无状态的协议)
      在这里插入图片描述
      但这也同时意味着,任何用户都能通过浏览器访问服务器资源,如果想保护服务器的某些资源,必须限制浏览器请求;要限制浏览器请求,必须鉴别浏览器请求,响应合法请求,忽略非法请求;要鉴别浏览器请求,必须清楚浏览器请求状态。既然http协议无状态,那就让服务器和浏览器共同维护一个状态吧!这就是会话机制
      
    2、会话机制
      浏览器第一次请求服务器,服务器创建一个会话,并将会话的id作为响应的一部分发送给浏览器,浏览器存储会话id,并在后续第二次和第三次请求中带上会话id,服务器取得请求中的会话id就知道是不是同一个用户了,这个过程用下图说明,后续请求与第一次请求产生了关联
      (解释: 登录的用户在session里面是可以查询到的已经存储的isLogin属性设置为true)
      在这里插入图片描述
      服务器在内存中保存会话对象,浏览器怎么保存会话id呢?你可能会想到两种方式:
    ①请求参数
    ②通过cookie实现

      将会话id作为每一个请求的参数,服务器接收请求自然能解析参数获得会话id,并借此判断是否来自同一会话,很明显,这种方式不靠谱。
      那就浏览器自己来维护这个会话id吧,每次发送http请求时浏览器自动发送会话id,cookie机制正好用来做这件事。cookie是浏览器用来存储少量数据的一种机制,数据以”key/value“形式存储,浏览器发送http请求时自动附带cookie信息

    tomcat会话机制当然也实现了cookie(解释: 就是当客户端访问tomcat的时候,tomcat也可以给客户端发送一个cookie),访问tomcat服务器时,浏览器中可以看到一个名为“JSESSIONID”的cookie,这就是tomcat会话机制维护的会话id,使用了cookie的请求响应过程如下图
      在这里插入图片描述
      3、登录状态
      有了会话机制,登录状态就好明白了,我们假设浏览器第一次请求服务器需要输入用户名与密码验证身份,服务器拿到用户名密码去数据库比对,正确的话说明当前持有这个会话的用户是合法用户,应该将这个会话标记为“已授权”或者“已登录”等等之类的状态,既然是会话的状态,自然要保存在会话对象中,tomcat在会话对象中设置登录状态如下
      在这里插入图片描述
      实现了登录状态的浏览器请求服务器模型如下图描述
      在这里插入图片描述
       每次请求受保护资源时都会检查会话对象中的登录状态,只有 isLogin=true 的会话才能访问,登录机制因此而实现。

    二、多系统的复杂性

    web系统早已从久远的单系统发展成为如今由多系统组成的应用群,面对如此众多的系统,用户难道要一个一个登录、然后一个一个注销吗?就像下图描述的这样
    在这里插入图片描述
    web系统由单系统发展成多系统组成的应用群,复杂性应该由系统内部承担,而不是用户。无论web系统内部多么复杂,对用户而言,都是一个统一的整体,也就是说,用户访问web系统的整个应用群与访问单个系统一样,登录/注销只要一次就够了
    在这里插入图片描述
    虽然单系统的登录解决方案很完美,但对于多系统应用群已经不再适用了,为什么呢?

    单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器与服务器之间维护会话状态。但cookie是有限制的,这个限制就是cookie的域(通常对应网站的域名)(解释: 就是说一个服务器产生的cookie只能在该服务器下使用,不能在其他服务器使用,而我们的分布式多系统就不一样了,有可能这个请求打到这台服务器上,下一个请求就打到另一台服务器上了,所以某一个服务器产生的cookie不能在所有其他服务器上起作用),浏览器发送http请求时会自动携带与该域匹配的cookie,而不是所有cookie,意思就是说该服务器产生的cookie,那么cookie的key就是这个服务器的域名(解释:也就是说客户端可以有很多个cookie,然后在负载均衡的情况下访问不同的服务器的时候,虽然每次访问都带了很多的cookie访问某一台服务器,但是浏览器可以拦截其他的cookie,只用本服务器产生的cookie)
      在这里插入图片描述
      既然这样,为什么不将web应用群中所有子系统(一个web应用的功能可能被分割成多个模块)的域名(解释: 每个模块可能有不同的域名,但是所有模块的功能总和组成了一整个web应用)统一在一个顶级域名下,例如“*.baidu.com”,然后将它们的cookie域设置为“baidu.com”,这种做法理论上是可以的,甚至早期很多多系统登录就采用这种同域名共享cookie的方式。(解释: 一个服务器产生的cookie只能在该服务器下使用,为了让浏览器访问各个子模块的时候都能够把共同的cookie带过去,那只有一种情况,那就是cookie的名字或者域名都是一个顶级域名,能够进行各个子模块的通配,从而各个子模块都可以接收这个cookie)
      下图是我对这段话的理解:
      在这里插入图片描述

    然而,可行并不代表好,共享cookie的方式存在众多局限。首先,应用群域名得统一;其次,应用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同(小疑问:就算web服务器相同,就一定能保证cookie的key值相同吗?还有不是说各个子模块的顶级域名已经相同了吗,为什么还有保证key值一样 啊?可能是说域名相同,只是能够确保能够让所有服务器都能够接收到这个cookie,但是接收到以后还要根据key值来取value值,所以key值最好是一样的,这样更方便些,而如果web服务器相同的话,那么key的值就相同(例如:tomcat为JSESSIONID)),无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间;第三,cookie本身不安全。

    因此,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录

    三、单点登录

    什么是单点登录?单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分
      1、登录
      相比于单系统登录,sso需要一个独立的认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌(tokens)实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式与单系统的登录方式相同。这个过程,也就是单点登录的原理,用下图说明
    解释: 浏览器首先访问系统1,系统1检测到用户没有登录。于是带上系统1的地址转发到sso认证中心,也发现没有登录,于是带上系统1的地址来到登录页面进行登录,登录完毕之后,sso认证中心就开始创建全局会话(
    小疑问:是如何创建全局会话的?
    答:sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话),创建授权令牌tokens,接着有了tokens令牌之后就可以跳转到系统1的地址了,这个时候系统1向sso认证中心校验令牌有效,sso认证中心把系统1的地址注册到sso认证中心上,然后返回给系统1,令牌有效,于是浏览器就可以访问系统1了。
    再接着如果浏览器要访问系统2的话,在系统2上一验证,发现没有登录,这个时候就带着系统2的地址跳去sso认证中心,sso认证中心上验证已经登录,于是把令牌tokens发送给系统2,这个时候系统2再次带着系统2的地址和令牌来到sso认证中心验证时,令牌肯定是有效的,然后sso中心把系统2的地址注册到本地上,接着告诉系统2,令牌有效,于是浏览器就可以和系统2进行局部会话了

    在这里插入图片描述
      下面给出最详细的权威的解释:在这里插入图片描述
      2、注销
      单点登录自然也要单点注销,在一个子系统中注销,所有子系统的会话都将被销毁,用下面的图来说明
      在这里插入图片描述
      在这里插入图片描述

    四、部署图

    单点登录涉及sso认证中心与众多子系统,子系统与sso认证中心需要通信以交换令牌、校验令牌及发起注销请求,因而子系统必须集成sso的客户端,sso认证中心则是sso服务端,整个单点登录过程实质是sso客户端与服务端通信的过程,用下图描述
      小疑问: 如果不加网络防火墙会怎么样? 防火墙怎么配置呢?有配置文件吗?还是只需要dos命令就行
    在这里插入图片描述
    sso认证中心与sso客户端通信方式有多种,这里以简单好用的httpClient为例,web service、rpc、restful api都可以

    五、实现

    只是简要介绍下基于java的实现过程,不提供完整源码,明白了原理,我相信你们可以自己实现。sso采用客户端/服务端架构,我们先看sso-client与sso-server要实现的功能(下面:sso认证中心=sso-server)
      在这里插入图片描述
      1、sso-client拦截未登录请求
      java拦截请求的方式有servlet、filter、listener三种方式,我们采用filter。在sso-client中新建LoginFilter.java类并实现Filter接口,在doFilter()方法中加入对未登录用户的拦截
      在这里插入图片描述
      2、sso-server拦截未登录请求
      拦截从sso-client跳转至sso认证中心的未登录请求,跳转至登录页面,这个过程与sso-client完全一样
      3、sso-server验证用户登录信息
      用户在登录页面输入用户名密码,请求登录,sso认证中心校验用户信息,校验成功,将会话状态标记为“已登录”
    在这里插入图片描述
    4、sso-server创建授权令牌
      授权令牌是一串随机字符,以什么样的方式生成都没有关系,只要不重复、不易伪造即可,下面是一个例子
      在这里插入图片描述
      5、sso-client取得令牌并校验
      sso认证中心登录后,跳转回子系统并附上令牌,子系统(sso-client)取得令牌,然后去sso认证中心校验,在LoginFilter.java的doFilter()中添加几行
    在这里插入图片描述
    小疑问: httpclient的参数是这样吗?不解,httpPost括号里面的参数

    6、sso-server接收并处理校验令牌请求
      用户在sso认证中心登录成功后,sso-server创建授权令牌并存储该令牌,所以,sso-server对令牌的校验就是去查找这个令牌是否存在以及是否过期,令牌校验成功后,sso-server将发送校验请求的系统注册到sso认证中心(就是存储起来的意思)

    令牌与注册系统地址通常存储在key-value数据库(如redis)中,redis可以为key设置有效时间也就是令牌的有效期。redis运行在内存中,速度非常快,正好sso-server不需要持久化任何数据。

    令牌与注册系统地址可以用下图描述的结构存储在redis中,可能你会问,为什么要存储这些系统的地址?如果不存储,注销的时候就麻烦了,用户向sso认证中心提交注销请求,sso认证中心注销全局会话,但不知道哪些系统用此全局会话建立了自己的局部会话,也不知道要向哪些子系统发送注销请求注销局部会话
      小疑问: 下面这幅图看不明白???在这里插入图片描述
      7、sso-client校验令牌成功创建局部会话
      令牌校验成功后,sso-client将当前局部会话标记为“已登录”,修改LoginFilter.java,添加几行(解释: 因为浏览器可能会访问多个子模块,从而产生多个局部会话,相当于浏览器与每个子模块服务器之间都有一个session)
      在这里插入图片描述
      sso-client还需将当前会话id(sessionID)与令牌绑定(解释: 因为一旦注销,那么就可以根据sessionID来取出令牌,最后到sso认证中心上检测存在该令牌,然后销毁全局会话,从而销毁所有的令牌),表示这个会话的登录状态与令牌相关,此关系可以用java的hashmap保存,保存的数据用来处理sso认证中心发来的注销请求(解释:就是说一个点发起了注销请求之后,sso认证中心接收到了之后,从而销毁全局会话,然后取出所有web应用各个模块系统的注册令牌并销毁,然后通知各个模块,令牌失效,各局部session全部销毁,这样一来,用户就不能和各子模块再次交互通信了
      重点: 本质上只有一个全局session会话(就是浏览器与sso认证中心的会话),其他的都是局部session,一旦消除全局session,那么局部session也会被通知由于各自的令牌销毁从而导致本局部session也要销毁
      
      8、注销过程
      用户向子系统发送带有“logout”参数的请求(注销请求),sso-client拦截器拦截该请求,向sso认证中心发起注销请求
      在这里插入图片描述
       sso认证中心也用同样的方式识别出sso-client的请求是注销请求(带有“logout”参数),sso认证中心注销全局会话
       在这里插入图片描述
       解释: 全局session(浏览器跟sso认证中心之间的session)注销之后触发LogoutListener,在LogoutListener中还要销毁所有的各个web系统的子模块的令牌

    sso认证中心有一个全局会话的监听器,一旦全局会话注销,将通知所有注册系统注销
      在这里插入图片描述
     
    在这里插入图片描述

    展开全文
  • CAS实现sso单点登录原理,可以方便技术人员理解
  • 文档详细介绍单点登录原理与简单实现,希望可以帮助学习的人
  • CAS单点登录原理解析

    千次阅读 2019-05-17 11:16:48
    推荐阅读 1.SpringBoot 整合篇 ...基于Cookie的单点登录核心原理: 将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从Cookie中取出用户名...

    1. SpringBoot 整合篇

    2. 手写一套迷你版HTTP服务器

    3. 记住:永远不要在MySQL中使用UTF-8

    4. Springboot启动原理解析

    1、基于Cookie的单点登录的回顾

    CAS单点登录原理解析

    基于Cookie的单点登录核心原理:

    将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从Cookie中取出用户名密码进行登录,让用户从某种意义上觉得只登录了一次。

    该方式缺点就是多次传送用户名密码,增加被盗风险,以及不能跨域。同时www.qiandu.com与mail.qiandu.com同时拥有登录逻辑的代码,如果涉及到修改操作,则需要修改两处。

    2、统一认证中心方案原理

    在生活中我们也有类似的相关生活经验,例如你去食堂吃饭,食堂打饭的阿姨(www.qiandu.com)告诉你,不收现金。并且告诉你,你去门口找换票的(passport.com)换小票。于是你换完票之后,再去找食堂阿姨,食堂阿姨拿着你的票,问门口换票的,这个票是真的吗?换票的说,是真的,于是给你打饭了。

    基于上述生活中的场景,我们将基于Cookie的单点登录改良以后的方案如下:

    CAS单点登录原理解析

    经过分析,Cookie单点登录认证太过于分散,每个网站都持有一份登陆认证代码。于是我们将认证统一化,形成一个独立的服务。当我们需要登录操作时,则重定向到统一认证中心http://passport.com。于是乎整个流程就如上图所示:

    第一步:用户访问www.qiandu.com。过滤器判断用户是否登录,没有登录,则重定向(302)到网站http://passport.com。
    第二步:重定向到passport.com,输入用户名密码。passport.com将用户登录的信息记录到服务器的session中。
    第三步:passport.com给浏览器发送一个特殊的凭证,浏览器将凭证交给www.qiandu.com,www.qiandu.com则拿着浏览器交给他的凭证去passport.com验证凭证是否有效,从而判断用户是否登录成功。
    第四步:登录成功,浏览器与网站之间进行正常的访问。

    3、Yelu大学研发的CAS(Central Authentication Server)

    下面就以耶鲁大学研发的CAS为分析依据,分析其工作原理。首先看一下最上层的项目部署图:

    CAS单点登录原理解析

    部署项目时需要部署一个独立的认证中心(cas.qiandu.com),以及其他N个用户自己的web服务。

    认证中心:也就是cas.qiandu.com,即cas-server。用来提供认证服务,由CAS框架提供,用户只需要根据业务实现认证的逻辑即可。

    用户web项目:只需要在web.xml中配置几个过滤器,用来保护资源,过滤器也是CAS框架提供了,即cas-client,基本不需要改动可以直接使用。

    4、CAS的详细登录流程

    CAS单点登录原理解析

    上图是3个登录场景,分别为:第一次访问www.qiandu.com、第二次访问、以及登录状态下第一次访问mail.qiandu.com。

    下面就详细说明上图中每个数字标号做了什么,以及相关的请求内容,响应内容。

    4.1、第一次访问www.qiandu.com

    标号1:用户访问http://www.qiandu.com,经过他的第一个过滤器(cas提供,在web.xml中配置)AuthenticationFilter。

    过滤器全称:org.jasig.cas.client.authentication.AuthenticationFilter

    主要作用:判断是否登录,如果没有登录则重定向到认证中心。

    标号2:www.qiandu.com发现用户没有登录,则返回浏览器重定向地址。

    CAS单点登录原理解析

    首先可以看到我们请求www.qiandu.com,之后浏览器返回状态码302,然后让浏览器重定向到cas.qiandu.com并且通过get的方式添加参数service,该参数目的是登录成功之后会要重定向回来,因此需要该参数。并且你会发现,其实server的值就是编码之后的我们请求www.qiandu.com的地址。

    标号3:浏览器接收到重定向之后发起重定向,请求cas.qiandu.com。

    标号4:认证中心cas.qiandu.com接收到登录请求,返回登陆页面。

    CAS单点登录原理解析

    上图就是标号3的请求,以及标号4的响应。请求的URL是标号2返回的URL。之后认证中心就展示登录的页面,等待用户输入用户名密码。

    标号5:用户在cas.qiandu.com的login页面输入用户名密码,提交。

    标号6:服务器接收到用户名密码,则验证是否有效,验证逻辑可以使用cas-server提供现成的,也可以自己实现。

    CAS单点登录原理解析

    上图就是标号5的请求,以及标号6的响应了。当cas.qiandu.com即csa-server认证通过之后,会返回给浏览器302,重定向的地址就是Referer中的service参数对应的值。后边并通过get的方式挟带了一个ticket令牌,这个ticket就是ST(数字3处)。同时会在Cookie中设置一个CASTGC,该cookie是网站cas.qiandu.com的cookie,只有访问这个网站才会携带这个cookie过去。

    Cookie中的CASTGC:向cookie中添加该值的目的是当下次访问cas.qiandu.com时,浏览器将Cookie中的TGC携带到服务器,服务器根据这个TGC,查找与之对应的TGT。从而判断用户是否登录过了,是否需要展示登录页面。TGT与TGC的关系就像SESSION与Cookie中SESSIONID的关系。

    • TGT:Ticket Granted Ticket(俗称大令牌,或者说票根,他可以签发ST)

    • TGC:Ticket Granted Cookie(cookie中的value),存在Cookie中,根据他可以找到TGT。

    • ST:Service Ticket (小令牌),是TGT生成的,默认是用一次就生效了。也就是上面数字3处的ticket值。

    标号7:浏览器从cas.qiandu.com哪里拿到ticket之后,就根据指示重定向到www.qiandu.com,请求的url就是上面返回的url。

    CAS单点登录原理解析

    标号8:www.qiandu.com在过滤器中会取到ticket的值,然后通过http方式调用cas.qiandu.com验证该ticket是否是有效的。

    标号9:cas.qiandu.com接收到ticket之后,验证,验证通过返回结果告诉www.qiandu.com该ticket有效。

    标号10:www.qiandu.com接收到cas-server的返回,知道了用户合法,展示相关资源到用户浏览器上。

    CAS单点登录原理解析

    至此,第一次访问的整个流程结束,其中标号8与标号9的环节是通过代码调用的,并不是浏览器发起,所以没有截取到报文。

    4.2、第二次访问www.qiandu.com

    上面以及访问过一次了,当第二次访问的时候发生了什么呢?

    标号11:用户发起请求,访问www.qiandu.com。会经过cas-client,也就是过滤器,因为第一次访问成功之后www.qiandu.com中会在session中记录用户信息,因此这里直接就通过了,不用验证了。

    标号12:用户通过权限验证,浏览器返回正常资源。

    4.3、访问mail.qiandu.com

    标号13:用户在www.qiandu.com正常上网,突然想访问mail.qiandu.com,于是发起访问mail.qiandu.com的请求。

    标号14:mail.qiandu.com接收到请求,发现第一次访问,于是给他一个重定向的地址,让他去找认证中心登录。

    CAS单点登录原理解析

    上图可以看到,用户请求mail.qiandu.com,然后返回给他一个网址,状态302重定向,service参数就是回来的地址。

    标号15:浏览器根据14返回的地址,发起重定向,因为之前访问过一次了,因此这次会携带上次返回的Cookie:TGC到认证中心。

    标号16:认证中心收到请求,发现TGC对应了一个TGT,于是用TGT签发一个ST,并且返回给浏览器,让他重定向到mail.qiandu.com

    CAS单点登录原理解析

    可以发现请求的时候是携带Cookie:CASTGC的,响应的就是一个地址加上TGT签发的ST也就是ticket。

    标号17:浏览器根据16返回的网址发起重定向。

    标号18:mail.qiandu.com获取ticket去认证中心验证是否有效。

    标号19:认证成功,返回在mail.qiandu.com的session中设置登录状态,下次就直接登录。

    标号20:认证成功之后就反正用想要访问的资源了。

    CAS单点登录原理解析

    5、总结

    至此,CAS登录的整个过程就完毕了,以后有时间总结下如何使用CAS,并运用到项目中。

    CAS单点登录原理解析

     

    作者:你明哥

    cnblogs.com/lihuidu/p/6495247.html

    CAS单点登录原理解析

    展开全文
  • 单点登录原理介绍.ppt

    2018-04-27 15:09:00
    单点登录原理介绍.ppt 主要描述 java、c 等语言下如何开发单点登录模块的思想及架构。
  • token实现单点登录原理

    千次阅读 2019-08-28 16:03:10
    自定义加密令牌Token实现单点登录与注销 前言 在日常的业务中,登录功能是非常常见的,除了最简单的cookie校验登录与session会话实现登录之外,针对较复杂的场景还可以使用更高安全的自定义加密令牌token来实现登录...

    自定义加密令牌Token实现单点登录与注销
    前言
    在日常的业务中,登录功能是非常常见的,除了最简单的cookie校验登录与session会话实现登录之外,针对较复杂的场景还可以使用更高安全的自定义加密令牌token来实现登录功能,此文将会详细介绍这种登录系统的实现方式。

    什么是单点登录?
    单点登录(Single Sign On),简称为 SSO,指的是应用于多个业务系统中的一种登录机制,在某个应用系统登录一次,就可以访问授权的其他同类应用系统。

    比如说,你要进入学校的选课系统查选课,第一次进入的时候,要求你输入学号密码登录。查完选课之后,你又想进入信息系统去查成绩,这时候直接进入信息系统,就能识别你之前的登录信息,不需要再次重复登录,这就是一种单点登录系统。

    同理,如果你是先点击进入信息系统查成绩,第一次进入也会要求输入学号密码登录。之后从信息系统,再进入选课系统也就能直接进入了,不需要再重复登录。

    简而言之,就是一种 登录一次实现多系统访问 的登录机制。

    实现原理是什么?
    登录的本质,就是一种用户识别模式,通过用户提交的登录信息来识别用户。

    单点登录中,不同的系统,都需要识别出同一个用户,所以需要专门的通用识别凭证令牌 以及一个单独的认证系统,用于完成这个用户识别。

    每个应用系统不再需要自行识别用户,获取用户信息,而是接入统一认证系统,根据是否有令牌判定登录状态,根据令牌有效验证判定用户信息。

    比如说,学生进入选课系统时,选课系统会检查,当前的浏览器里,是否有一个专门的登录凭证令牌(这个令牌可以取名叫token或者ticket)。如果没有这个令牌,就会跳转到登录页面,要求用户输入信息登录。

    用户输入登录信息之后,选课系统会把信息数据发到认证系统,由认证系统进行用户校验。这时候,认证系统就会去检查账号密码,并且告诉应用系统(此处为选课系统),用户的账号密码是否正确,是否有账户异常。

    如果校验信息无误,认证系统就会生成一个专门的登录凭证令牌,最终返回保存到用户的浏览器中。

    此时,重新进入应用系统(此处为选课系统),应用系统会检查是否存在登录凭证令牌。

    如果已经获取了这个令牌,应用系统就会让统一认证系统进行令牌验证,校验这个令牌是否有效。

    统一认证系统的判定有效,并且返回用户信息之后,应用系统才会根据这个用户信息来放行用户进入。
    在这里插入图片描述
    实现细节与流程
    登录信息的传输
    用户表的设计
    用户令牌的生成
    用户令牌的附属功能
    用户令牌的传输
    用户令牌的保存
    用户令牌的校验
    业务系统的放行
    实现示例

    展开全文
  • 单点登录原理与简单实现 一、单系统登录机制 1、http无状态协议  web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,...

    单点登录原理与简单实现

    一、单系统登录机制

    1、http无状态协议

      web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系

    3c91a3bf-25d8-4b1f-8e4a-68535c51aaa8

      但这也同时意味着,任何用户都能通过浏览器访问服务器资源,如果想保护服务器的某些资源,必须限制浏览器请求;要限制浏览器请求,必须鉴别浏览器请求,响应合法请求,忽略非法请求;要鉴别浏览器请求,必须清楚浏览器请求状态。既然http协议无状态,那就让服务器和浏览器共同维护一个状态吧!这就是会话机制

    2、会话机制

      浏览器第一次请求服务器,服务器创建一个会话,并将会话的id作为响应的一部分发送给浏览器,浏览器存储会话id,并在后续第二次和第三次请求中带上会话id,服务器取得请求中的会话id就知道是不是同一个用户了,这个过程用下图说明,后续请求与第一次请求产生了关联

    8a9fb230-d506-4b19-b821-4001c68c4588

      服务器在内存中保存会话对象,浏览器怎么保存会话id呢?你可能会想到两种方式

    1. 请求参数
    2. cookie

      将会话id作为每一个请求的参数,服务器接收请求自然能解析参数获得会话id,并借此判断是否来自同一会话,很明显,这种方式不靠谱。那就浏览器自己来维护这个会话id吧,每次发送http请求时浏览器自动发送会话id,cookie机制正好用来做这件事。cookie是浏览器用来存储少量数据的一种机制,数据以”key/value“形式存储,浏览器发送http请求时自动附带cookie信息

      tomcat会话机制当然也实现了cookie,访问tomcat服务器时,浏览器中可以看到一个名为“JSESSIONID”的cookie,这就是tomcat会话机制维护的会话id,使用了cookie的请求响应过程如下图

    518293d9-64b2-459c-9d45-9f353c757d1f

    3、登录状态

      有了会话机制,登录状态就好明白了,我们假设浏览器第一次请求服务器需要输入用户名与密码验证身份,服务器拿到用户名密码去数据库比对,正确的话说明当前持有这个会话的用户是合法用户,应该将这个会话标记为“已授权”或者“已登录”等等之类的状态,既然是会话的状态,自然要保存在会话对象中,tomcat在会话对象中设置登录状态如下

    1

    2

    HttpSession session = request.getSession();

    session.setAttribute("isLogin"true);

      用户再次访问时,tomcat在会话对象中查看登录状态

    1

    2

    HttpSession session = request.getSession();

    session.getAttribute("isLogin");

      实现了登录状态的浏览器请求服务器模型如下图描述

    70e396fa-1bf2-42f8-a504-ce20306e31fa

      每次请求受保护资源时都会检查会话对象中的登录状态,只有 isLogin=true 的会话才能访问,登录机制因此而实现。

    二、多系统的复杂性

      web系统早已从久远的单系统发展成为如今由多系统组成的应用群,面对如此众多的系统,用户难道要一个一个登录、然后一个一个注销吗?就像下图描述的这样

    6dfbb0b1-46c0-4945-a3bf-5f060fa80710

      web系统由单系统发展成多系统组成的应用群,复杂性应该由系统内部承担,而不是用户。无论web系统内部多么复杂,对用户而言,都是一个统一的整体,也就是说,用户访问web系统的整个应用群与访问单个系统一样,登录/注销只要一次就够了

    9fe14ab3-4254-447b-b850-0436e628c254

      虽然单系统的登录解决方案很完美,但对于多系统应用群已经不再适用了,为什么呢?

      单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器与服务器之间维护会话状态。但cookie是有限制的,这个限制就是cookie的域(通常对应网站的域名),浏览器发送http请求时会自动携带与该域匹配的cookie,而不是所有cookie

    4d58ccfa-0114-486d-bec2-c28f2f9eb513

      既然这样,为什么不将web应用群中所有子系统的域名统一在一个顶级域名下,例如“*.baidu.com”,然后将它们的cookie域设置为“baidu.com”,这种做法理论上是可以的,甚至早期很多多系统登录就采用这种同域名共享cookie的方式。

      然而,可行并不代表好,共享cookie的方式存在众多局限。首先,应用群域名得统一;其次,应用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间;第三,cookie本身不安全。

      因此,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录

    三、单点登录

      什么是单点登录?单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分

    1、登录

      相比于单系统登录,sso需要一个独立的认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式与单系统的登录方式相同。这个过程,也就是单点登录的原理,用下图说明

      下面对上图简要描述

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

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

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

      你可以通过博客园、百度、csdn、淘宝等网站的登录过程加深对单点登录的理解,注意观察登录过程中的跳转url与参数

    2、注销

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

    3b139d2e-0b83-4a69-b4f2-316adb8997ce

      sso认证中心一直监听全局会话的状态,一旦全局会话销毁,监听器将通知所有注册系统执行注销操作

      下面对上图简要说明

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

    四、部署图

      单点登录涉及sso认证中心与众子系统,子系统与sso认证中心需要通信以交换令牌、校验令牌及发起注销请求,因而子系统必须集成sso的客户端,sso认证中心则是sso服务端,整个单点登录过程实质是sso客户端与服务端通信的过程,用下图描述

    fb29685c-487c-42b9-9ceb-6c7ee29e98c9

      sso认证中心与sso客户端通信方式有多种,这里以简单好用的httpClient为例,web service、rpc、restful api都可以

    五、实现

      只是简要介绍下基于java的实现过程,不提供完整源码,明白了原理,我相信你们可以自己实现。sso采用客户端/服务端架构,我们先看sso-client与sso-server要实现的功能(下面:sso认证中心=sso-server)

      sso-client

    1. 拦截子系统未登录用户请求,跳转至sso认证中心
    2. 接收并存储sso认证中心发送的令牌
    3. 与sso-server通信,校验令牌的有效性
    4. 建立局部会话
    5. 拦截用户注销请求,向sso认证中心发送注销请求
    6. 接收sso认证中心发出的注销请求,销毁局部会话

      sso-server

    1. 验证用户的登录信息
    2. 创建全局会话
    3. 创建授权令牌
    4. 与sso-client通信发送令牌
    5. 校验sso-client令牌有效性
    6. 系统注册
    7. 接收sso-client注销请求,注销所有会话

      接下来,我们按照原理来一步步实现sso吧!

    1、sso-client拦截未登录请求

      java拦截请求的方式有servlet、filter、listener三种方式,我们采用filter。在sso-client中新建LoginFilter.java类并实现Filter接口,在doFilter()方法中加入对未登录用户的拦截

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;

        HttpServletResponse res = (HttpServletResponse) response;

        HttpSession session = req.getSession();

         

        if (session.getAttribute("isLogin")) {

            chain.doFilter(request, response);

            return;

        }

        //跳转至sso认证中心

        res.sendRedirect("sso-server-url-with-system-url");

    }

    2、sso-server拦截未登录请求

      拦截从sso-client跳转至sso认证中心的未登录请求,跳转至登录页面,这个过程与sso-client完全一样

    3、sso-server验证用户登录信息

      用户在登录页面输入用户名密码,请求登录,sso认证中心校验用户信息,校验成功,将会话状态标记为“已登录”

    1

    2

    3

    4

    5

    6

    @RequestMapping("/login")

    public String login(String username, String password, HttpServletRequest req) {

        this.checkLoginInfo(username, password);

        req.getSession().setAttribute("isLogin"true);

        return "success";

    }

    4、sso-server创建授权令牌

      授权令牌是一串随机字符,以什么样的方式生成都没有关系,只要不重复、不易伪造即可,下面是一个例子

    1

    String token = UUID.randomUUID().toString();

    5、sso-client取得令牌并校验

      sso认证中心登录后,跳转回子系统并附上令牌,子系统(sso-client)取得令牌,然后去sso认证中心校验,在LoginFilter.java的doFilter()中添加几行

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    // 请求附带token参数

    String token = req.getParameter("token");

    if (token != null) {

        // 去sso认证中心校验token

        boolean verifyResult = this.verify("sso-server-verify-url", token);

        if (!verifyResult) {

            res.sendRedirect("sso-server-url");

            return;

        }

        chain.doFilter(request, response);

    }

      verify()方法使用httpClient实现,这里仅简略介绍,httpClient详细使用方法请参考官方文档

    1

    2

    HttpPost httpPost = new HttpPost("sso-server-verify-url-with-token");

    HttpResponse httpResponse = httpClient.execute(httpPost);

    6、sso-server接收并处理校验令牌请求

      用户在sso认证中心登录成功后,sso-server创建授权令牌并存储该令牌,所以,sso-server对令牌的校验就是去查找这个令牌是否存在以及是否过期,令牌校验成功后sso-server将发送校验请求的系统注册到sso认证中心(就是存储起来的意思)

      令牌与注册系统地址通常存储在key-value数据库(如redis)中,redis可以为key设置有效时间也就是令牌的有效期。redis运行在内存中,速度非常快,正好sso-server不需要持久化任何数据。

      令牌与注册系统地址可以用下图描述的结构存储在redis中,可能你会问,为什么要存储这些系统的地址?如果不存储,注销的时候就麻烦了,用户向sso认证中心提交注销请求,sso认证中心注销全局会话,但不知道哪些系统用此全局会话建立了自己的局部会话,也不知道要向哪些子系统发送注销请求注销局部会话

    3b221593-f9c4-45af-a567-4937786993e8

    7、sso-client校验令牌成功创建局部会话

      令牌校验成功后,sso-client将当前局部会话标记为“已登录”,修改LoginFilter.java,添加几行

    1

    2

    3

    if (verifyResult) {

        session.setAttribute("isLogin"true);

    }

      sso-client还需将当前会话id与令牌绑定,表示这个会话的登录状态与令牌相关,此关系可以用java的hashmap保存,保存的数据用来处理sso认证中心发来的注销请求

    8、注销过程

      用户向子系统发送带有“logout”参数的请求(注销请求),sso-client拦截器拦截该请求,向sso认证中心发起注销请求

    1

    2

    3

    4

    String logout = req.getParameter("logout");

    if (logout != null) {

        this.ssoServer.logout(token);

    }

      sso认证中心也用同样的方式识别出sso-client的请求是注销请求(带有“logout”参数),sso认证中心注销全局会话

    1

    2

    3

    4

    5

    6

    7

    8

    @RequestMapping("/logout")

    public String logout(HttpServletRequest req) {

        HttpSession session = req.getSession();

        if (session != null) {

            session.invalidate();//触发LogoutListener

        }

        return "redirect:/";

    }

      sso认证中心有一个全局会话的监听器,一旦全局会话注销,将通知所有注册系统注销

    1

    2

    3

    4

    5

    6

    7

    8

    public class LogoutListener implements HttpSessionListener {

        @Override

        public void sessionCreated(HttpSessionEvent event) {}

        @Override

        public void sessionDestroyed(HttpSessionEvent event) {

            //通过httpClient向所有注册系统发送注销请求

        }

    }

    单点登录的三种实现方式

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

    • 存储信任
    • 验证信任

    如果一个系统做到了开头所讲的效果,也就算单点登录,单点登录有不同的实现方式,本文就罗列我开发中所遇见过的实现方式。

    以Cookie作为凭证媒介

    最简单的单点登录实现方式,是使用cookie作为媒介,存放用户凭证。 用户登录父应用之后,应用返回一个加密的cookie,当用户访问子应用的时候,携带上这个cookie,授权应用解密cookie并进行校验,校验通过则登录当前用户。

    Auth via cookie

    不难发现以上方式把信任存储在客户端的Cookie中,这种方式很容易令人质疑:

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

    对于第一个问题,通过加密Cookie可以保证安全性,当然这是在源代码不泄露的前提下。如果Cookie的加密算法泄露,攻击者通过伪造Cookie则可以伪造特定用户身份,这是很危险的。 对于第二个问题,更是硬伤。

    通过JSONP实现

    对于跨域问题,可以使用JSONP实现。 用户在父应用中登录后,跟Session匹配的Cookie会存到客户端中,当用户需要登录子应用的时候,授权应用访问父应用提供的JSONP接口,并在请求中带上父应用域名下的Cookie,父应用接收到请求,验证用户的登录状态,返回加密的信息,子应用通过解析返回来的加密信息来验证用户,如果通过验证则登录用户。

    Auth via jsonp

    这种方式虽然能解决跨域问题,但是安全性其实跟把信任存储到Cookie是差不多的。如果一旦加密算法泄露了,攻击者可以在本地建立一个实现了登录接口的假冒父应用,通过绑定Host来把子应用发起的请求指向本地的假冒父应用,并作出回应。 因为攻击者完全可以按照加密算法来伪造响应请求,子应用接收到这个响应之后一样可以通过验证,并且登录特定用户。

    通过页面重定向的方式

    最后一种介绍的方式,是通过父应用和子应用来回重定向中进行通信,实现信息的安全传递。 父应用提供一个GET方式的登录接口,用户通过子应用重定向连接的方式访问这个接口,如果用户还没有登录,则返回一个的登录页面,用户输入账号密码进行登录。如果用户已经登录了,则生成加密的Token,并且重定向到子应用提供的验证Token的接口,通过解密和校验之后,子应用登录当前用户。

    Auth via redirect

    这种方式较前面两种方式,接解决了上面两种方法暴露出来的安全性问题和跨域的问题,但是并没有前面两种方式方便。 安全与方便,本来就是一对矛盾。

    使用独立登录系统

    一般说来,大型应用会把授权的逻辑与用户信息的相关逻辑独立成一个应用,称为用户中心。 用户中心不处理业务逻辑,只是处理用户信息的管理以及授权给第三方应用。第三方应用需要登录的时候,则把用户的登录请求转发给用户中心进行处理,用户处理完毕返回凭证,第三方应用验证凭证,通过后就登录用户。

    展开全文
  • 基于 redis 的单点登录原理

    千次阅读 2019-02-16 19:48:54
    原理:就是在一个网站的根地址里添加一个cookie,cookie的value就是用户登录的sessionid,将这个sessioid作为redis的key,用户的信息作为value,存储在redis里,这样该网站所有的子域名都可以获取到这个cookie,然后...
  • 单点登录原理及其实现方案

    千次阅读 2021-02-02 12:54:47
    单点登录(Single sign-on,简称 SSO),一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。 当拥有该属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。所以...
  • CAS单点登录原理分析(一)

    万次阅读 多人点赞 2018-11-13 21:43:02
    一,业务分析 在分布式系统架构中,假设把上述的三个子系统部署在三个不同的服务器上。前提是用户登录之后才能访问这些子系统。那么使用传统方式,可能会...而使用单点登录就可以很好地解决上述的问题。 二,单...
  • CAS实现单点登录原理

    千次阅读 2018-10-25 20:23:47
    单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 CAS框架:CAS(Central Authentication Service)是实现SSO单点登录的框架。 2、盗一张学习CAS...
  • 14-Shiro-单点登录原理

    千次阅读 2019-04-07 02:40:56
    单点登录原理 一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用...
  • Spring Security Oauth2单点登录原理与技术 一、什么是 oAuth --协议 oAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息...
  • 单点登录原理与代码实现

    千次阅读 2018-09-17 11:52:00
    一、系统登录机制 1、http无状态协议  web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次...
  • 单点登录原理加部分核心实现例子,经典入门,快速理解单点登录 单点登录原理加部分核心实现例子,经典入门,快速理解单点登录
  • 主要介绍了SpringMVC拦截器实现单点登录,简单介绍了springmvc拦截器,单点登录实现原理等相关内容,具有一定参考价值,需要的朋友可以了解下。
  • 单点登录(Single Sign On),简称为 SSO,SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 2. 单点登陆的技术实现机制 单点登录的机制也一样,如下图所示,当用户第一次...
  • cookie原理详解及单点登录原理

    千次阅读 2020-01-22 09:50:18
    用它可以进行用户信息的检验,实际案例—单点登录。 cookie的原理 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-btrKkH5M-1579657738694)...
  • SSO单点登录原理及实现

    千次阅读 2019-02-22 12:38:52
    单点登录( Single Sign-On , 简称 SSO )是多个相关但独立的软件系统访问控制的一个属性。通过使用该属性,用户登录与单个ID和密码来访问所连接的一个或多个系统,而不使用不同的用户名或密码,或在某些配置中无缝...
  • SSO单点登录原理剖析

    千次阅读 2018-11-01 14:51:06
    CAS实现SSO单点登录原理 1. CAS 简介 1.1. What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决...
  • 主要介绍了spring boot如何基于JWT实现单点登录详解,用户只需登录一次就能够在这两个系统中进行操作。很明显这就是单点登录(Single Sign-On)达到的效果,需要的朋友可以参考下
  • CAS实现SSO单点登录原理.pdf
  • cas跨域单点登录原理

    万次阅读 热门讨论 2017-04-17 21:12:43
    cas跨域单点登录原理
  • 首先是单点登录的基本原理理解,此处可看这篇文章,写得很浅显易懂:https://www.cnblogs.com/lexiaofei/p/7172214.html 进入正题,如何真正实现一个系统的单点登录方案呢? 大家都知道在JAVA web中,服务器保持...
  • Spring.net框架属性注入+用户单点登录原理+memcached缓存,可以用于学习和研究,很好的例子,欢迎大家下载学习
  • shiro 单点登录原理 实例

    万次阅读 2017-02-08 17:39:55
    Shiro 1.2开始提供了Jasig CAS单点登录的支持,单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录。 Jasig CAS单点登录系统分为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 90,724
精华内容 36,289
关键字:

单点登录原理