外行人都懂的单点登录,不看血亏!!!!
什么是单点登录
单点登录的英文名 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的俩个组成部分
- CAS Server : 单点验证服务器,就是上面提到的SSO认证中心
- CAS Client :CAS Server服务的客户端系统
CAS的三个重要术语
- 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流程
假设我们有俩个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学习资源,希望和大家一起进步,共同成长。
以上内容如有错误,还望指出,感谢
公众号点击交流,添加我的微信,一起交流编程呗!
公众号: 小白不想当码农