单点登陆的英文名 Single Sign On (SSO)。SSO的定义是在多个应用系统中,用户只须要登陆一次就能够访问全部相互信任的应用系统。好比说淘宝和天猫都是阿里巴巴的子系统,在网页端,咱们登陆了淘宝,那么天猫也会自动登陆;反之相同。java
下面看一下单点登陆的大概的设计git
如上SSO的关键就是SSO认证中心,全部的子系统经过与SSO交互实现了一端登陆其余端自动登陆。程序员
在了解多系统SSO设计与实现以前咱们先来看一下单系统登陆的设计与实现github
在初学servlet和jsp的时候,咱们实现的web项目的全部功能都部署在同一个tomcat服务器上面,经过http:localhost:8080/web/path进行访问,这就是单系统。web
咱们知道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的俩个组成部分浏览器
- CAS Server : 单点验证服务器,就是上面提到的SSO认证中心
- CAS Client :CAS Server服务的客户端系统
CAS的三个重要术语tomcat
- TGT:Ticket Granting Ticket ,用户登陆后生成的票根,包含用户的认证身份,有效期等,存储于CAS Server中,相似于服务器的session
- TGC:Ticket Granting Cookie ,存储于cookie中,相似于SessionId。用户与CAS Server交互时,帮助用户查找相应的TGT
- ST:Sservice Ticket ,CAS Server 签发的一次性票据,CAS Client 使用ST与CAS Server交互
假设咱们有俩个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
其实看了上面的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学习资源,但愿和你们一块儿进步,共同成长。
以上内容若有错误,还望指出,感谢
公众号点击交流,添加个人微信,一块儿交流编程呗!
公众号: 小白不想当码农