外行人都懂的单点登录,不看血亏!!!!

什么是单点登录

单点登录的英文名 Single Sign On (SSO)。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。比如说淘宝和天猫都是阿里巴巴的子系统,在网页端,我们登录了淘宝,那么天猫也会自动登录;反之相同。

下面看一下单点登录的大概的设计

在这里插入图片描述

如上SSO的关键就是SSO认证中心,所有的子系统通过与SSO交互实现了一端登录其他端自动登录。

单系统登录设计与实现

在了解多系统SSO设计与实现之前我们先来看一下单系统登录的设计与实现

在初学servlet和jsp的时候,我们实现的web项目的所有功能都部署在同一个tomcat服务器上面,通过http:localhost:8080/web/path进行访问,这就是单系统。

在这里插入图片描述

单系统登录的实现

我们知道HTTP协议是无状态的,即每一次http请求都是独立的,不会相互影响。对于同一客户端发起的俩次请求,服务器端不会识别出来这俩个请求来自同一客户端。而Cookie和Session就是解决Http无状态的机制,Cookie存储在客户端,Session存储在服务器端;服务器在请求的response中放入Cookie,浏览器收到Cookie后保存起来,然后下一次请求时携带上Cookie,在服务器端通过getCookie可以获得cookie;而session在存储在服务器端用于维护会话状态的对象,session借助于cookie实现,每一个session通过一个JESSIONID值来标识,服务器通过set-cookie让浏览器保存这个id,然后在请求中通过cookie中的id来getSession。

单系统登录通过Cookie和Session就可以实现。

在这里插入图片描述

多系统单点登录的设计与实现

提到单系统SSO就不得不提CAS(Central Authentication Service),CAS是实现SSO的一个框架

CAS的俩个组成部分

  1. CAS Server : 单点验证服务器,就是上面提到的SSO认证中心
  2. CAS Client :CAS Server服务的客户端系统

CAS的三个重要术语

  1. TGT:Ticket Granting Ticket ,用户登录后生成的票根,包含用户的认证身份,有效期等,存储于CAS Server中,类似于服务器的session
  2. TGC:Ticket Granting Cookie ,存储于cookie中,类似于SessionId。用户与CAS Server交互时,帮助用户查找相应的TGT
  3. ST:Sservice Ticket ,CAS Server 签发的一次性票据,CAS Client 使用ST与CAS Server交互
CAS流程

假设我们有俩个CAS Client系统webA(www.weba.sheledon.com)和webB(www.webb.sheledon.com)和一个CAS Server(www.sso.com)

在这里插入图片描述

首先有一个用户来访问我们的webA系统,webA系统发现这个用户没有登录,然后将用户定向到sso认证中心(redirect: www.sso.com/login?service=weba)

sso认证中心发现用户没有SSO的session,于是向用户返回wea的登录页面
在这里插入图片描述

用户根据登录页面向sso认证中提交登录表单

sso认证中心访问数据库验证用户信息,验证完成后创建一个SSO的TGT,通过set-cookie将TGT的key值TGC存储在客户端,同时生成ticket,并且302重定向 redirect:www.weba.com?ticket=7980

用户携带ticket访问webA系统,webA系统再向SSO认证中心验证ticket的真伪,验证成功后,认证中心会响应一些必要属性给webA系统

TGC验证通过后webA系统和用户建立局部会话,并且授予用户权限,用户可以访问webA系统的资源。

在这里插入图片描述

用户成功登录系统A后,然后访问系统B(www.webb.com)

系统B发现用户没有登录(用户还没有与系统B建立局部对话),重定向到SSO Server

由于用户已经与CAS Server建立了全局对话,而且将TGC通过cookie保存在了客户端,所以重定向携带TGC

CAS Server发现请求的cookie中有TGC,所以生成ticket,重定向www.webb.com?ticket=83745

系统B向SSO Server验证ticket,验证通过后,系统B与用户建立局部对话,返回资源。

在这里插入图片描述

以上就是CAS大概的执行流程,其实看完这个流程大家完全可以自己实现一个SSO的demo

自己实现SSO的demo

其实看了上面的CAS流程我们自己也非常容易实现一个小demo,我自己也实现了一个非常简易的CAS,源代码可以访问我的github仓库:

https://github.com/Sheledons/SSODemo

实现也无非就是通过拦截器加一些条件判断进行重定向或者资源的响应,但是在重定向的时候需要注意的就是针对浏览器的同源策略的解决,我使用的CORS。关于同源策略以及解决方案,可以看一下下面的几篇文章

https://juejin.im/post/6844903681683357710

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS


重磅资源!!!

关注小白不想当码农微信公众号。

后台回复java核心技术卷关键字领取《java核心技术卷》pdf

回复jvm领取《深入理解Java虚拟机》pdf和《自己动手写jvm

回复设计模式领取《headfirst设计模式》pdf

回复计算机网络领取《计算机网络自顶向下》pdf


最后

我是不想当码农的小白,平时会写写一些技术博客,推荐优秀的程序员博主给大家还有自己遇到的优秀的java学习资源,希望和大家一起进步,共同成长。

以上内容如有错误,还望指出,感谢

公众号点击交流,添加我的微信,一起交流编程呗!

公众号: 小白不想当码农

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值