sso单点登录简单剖析

简单梳理一下SSO的实现大概流程,供需者参考.

1.什么是 SSO?

SSO(Single Sign On),中文翻译为单点登录.简单说就是,用户只需要登录一次就可以访问所有相互信任的应用系统。

2.单系统单模到现在的多系统多模块用户的体验

1.>我们发现若多个系统每次都需要登录退出会极大的造成用户体验很差
2.>我们想要达到的效果就是,若一个系统登录或退出,其它的系统自动实现登录退出的效果.
3.>举例说明,想要达到的效果如,登录到了淘宝,然后直接访问天猫的时候,天猫会自动登录
单系统模块与多系统模块

3.SSO的优缺点

优点
1.>提高用户体验及效率
2.>提高开发人员的开发效果
3.>简化管理
缺点
1.>不利于重构,设计系统过多.重构必然要兼容所有的系统
2.>无人看守桌面,因为只需登录一次,所有授权的应用系统都可以访问,坑导致一些很重要的信息泄露

4. 什么是CAS

随着 SSO 技术的流行,相关产品也比较多,其中 CAS 就是一套方案CAS(CentralAuthentication Service),中文翻译为统一身份认证服务或中央身份服务,它由服务端和客户端组成,实现了 SSO,并且容易进行企业应用的集成。
4.1. CAS 具有以下特点:

  • 开源的企业级单点登录解决方案。
  • CAS Server 为需要独立部署的 Web 应用。
  • CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

4.2 有了CAS,系统架构就演变成了下图这样
CAS
4.3 CAS包含两个部分

  • CAS Server(服务端) 和 CAS Client(客户端)。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。

  • CAS Server需要将war包部署在tomcat中,tomcat的版本为8以上

5. 注册可以访问的客户端

  • 客户端接入 CAS 首先需要在服务端进行注册,否则客户端访问将提示“未认证授权的服务”

注册步骤

  • 修改服务文件: 在部署的位置找到WEB-INF/classes/services/HTTPSandXXXXXX.json 文件,这里的值支持正则表达式,因此,也可以限定某个或某些具体的域名或 ip 才能访问服务端。如^http://localhost.*$,是只允许本地所有的客户端的访问。

    相关属性说明(了解):

@class:必须为 org.apereo.cas.services.RegisteredService 的实现类
serviceId:对服务进行描述的表达式,可用于匹配一个或多个 URL 地址
name: 服务名称
id:全局唯一标志
evaluationOrder:定义多个服务的执行顺序
  • 第二步:修改 application.properties 文件,告知 CAS 服务端从本地加载服务定义文件的位置等,将下面的配置复制到配置文件的最后:(修改完成后,需要重启服务端才能生效!)
#开启识别 json 文件,默认 false
cas.serviceRegistry.initFromJson=true

#自动扫描服务配置,默认开启
#cas.serviceRegistry.watcherEnabled=true

#120 秒扫描一遍
#cas.serviceRegistry.repeatInterval=120000

#延迟 15 秒开启
#cas.serviceRegistry.startDelay=15000

#资源加载路径
#cas.serviceRegistry.config.location=classpath:/services

6. 原理探究

6.1 CAS专业术语

  • TGT(Ticket Granting ticket,票据授予的票据):CAS 服务端根据登录成功的用户信息生成的一张大票据,该票据封装了 TGC 和对应的用户信息等,也用来签发 ST(票据,TGC 可以生成 ST 票据)。换句话说,如果服务端上有 TGT,则证明某用户正在登录中或曾经登录过。它之所以叫这个名字,是因为该票据可以签发(授予)ST。该票据存放于 CAS 服务端中,默认在内存缓存中(InMemoryService)。默认有效期为 120 分钟

  • TGC (Ticket-granting cookie, 票据授予的 Cookie):就是一个 cookie,用来存放用户身份相关信息(加密过的), 数据结构是个数组对象。它是由 CAS 服务端生成,写入浏览器的 cookie 中。默认有效期为 120 分钟,浏览器关闭时销毁。

  • ST(Service ticket, 服务票据):是 TGT 签发给某个客户端服务的一次性票据,数据结构是一个长字符串,当客户端服务拿到该票据后,要立刻回过头来找 CAS 服务端验证真伪(TGT 有能力验证)。
    验证通过,则可以访问该客户端请求的资源;验证不通过,则抛出异常,提示不识别票据。

PS:

1)这个服务票据是临时一次性的,有效期非常的短,也就是说,服务端发出 ST,客户端拿

到ST,客户端要立刻到服务端去校验,如果中间出现某个环节时间过长,则票据验证失败。

2)客户端到服务端校验 ST 后,服务端返回的是个 XML,最终封装成一个
   信任对象(Assertion)保存到客户端浏览器的 session 中,
   该信任对象(Assertion)是客户端服务保持对浏览器信任的重要对象。
   也就是说,一旦客户端的 Session 中有了该对象,
   那么浏览器访问该客户端的资源无需再到CAS服务端认证了。

6.2. 单点登录的流程分析

  • 下图是访问资源时统一身份认证的大流程图:
    这里写图片描述

  • 第一次浏览器访问客户端 A页面

这里写图片描述

  • 浏览器访问客户端B 的页面免登录流程(客户端A登录状态)
    这里写图片描述

  • 浏览器伪造 ST 访问客户端 A
    这里写图片描述

  • 浏览器在客户端 A 靠 session 中的信任对象维持认证
    这里写图片描述

7. 单点登录退出

实现方式

  • 在任意客户端应用的浏览器中点击退出按钮,浏览器会自动跳转到 CAS 服务端提供的一个注销成功页面
  • 如果想和淘宝一样,退出后跳转到登录页面,再次登录后,还能回到某个应用的页面,则需要修改服务端的配置文件。操作如下:打开服务端的\cas\WEB-INF\classes\application.properties 文件,在文件最后添加一行,修改完毕后需要重启 cas 的服务端的服务
##
#Logout 退出
#
#是否允许退出后跳转到登录页面并指定再次登录后跳转的页面,
默认是 false,即登录不重定向到 service 参数指定的页面
cas.logout.followServiceRedirects=true
  • 注销登出相关的官方配置项参考如下
##
#Logout 退出
#
#是否允许退出后跳转到登录页面并指定再次登录后跳转的页面,
默认是 false,即登录不重定向到 service 参数指定的页面
# cas.logout.followServiceRedirects=false
#退出后再次登录需指定的页面的参数名,默认是 service
# cas.logout.redirectParameter=service
#退出时是否先跳转到确认页面,默认是 false
#cas.logout.confirmLogout=false
#cas.logout.removeDescendantTickets=false

退出的流程图
这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41478499/article/details/80629690