SSO单点登录
一、什么是SSO
单点登录( Single Sign-On , 简称 SSO )是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包含多个用户,多个应用,1个SSO认证服务三种角色。SSO 实现模式多种多样,但要包括以下三个原则:
1、所有的认证登录都在 SSO 认证中心进行;
2、SSO 认证中心通过一些方法来告诉 Web 应用当前访问用户究竟是不是已通过认证的用户;
3、SSO 认证中心和所有的 Web 应用建立一种信任关系,也就是说 web 应用必须信任认证中心。(单点信任)
二、CAS企业级单点登录框架
CAS(Central Authentication Service中央认证服务) Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。
CAS 包括两部分: CAS Server 和 CAS Client 。实现流程如图:
1.架构笨重
2.基于JAVA安全证书的 https 访问,需要购买证书。
三、同主域下模拟CAS实现单点登录
假设有两个网站分别为a.mysite.com(简称a服务)和b.mysite.com(简称b服务),和一个SSO单点登录服务sso.mysite.com(简称sso服务)。
实现步骤:
- 用户访问a.mysite.com,在a服务上使用拦截器检查Cookie中是否有Token;
- 如果发现没有授权,此时跳转到sso.mysite.com网站进入登录认证;
- sso服务处理流程
- 如果用户名和密码正确,登录成功后生成Token,
- 以Token为key,查询到的User对象为value,存入到Redis缓存中,缓存时间 30分钟。
- 将Token写入到.mysite.com域下客户端Cookie中
- 跳转到a.mysite.com
- 在a服务上使用拦截器检查有Token,将此Token在Redis取出登录用户,只有Token和User同时存在,则判断授权成功。并将User存入request作用域,供本站使用。
- 用户访问b.mysite.com,在b服务上使用拦截器检查Cookie中是否有Token;
- 如果发现没有授权,此时跳转到sso.mysite.com网站进入登录认证;
- 由于sso.mysite.com域上Cookie中已经存在Token,则认为已经登录,跳转到b.mysite.com
退出登录步骤:
- 由sso.mysite.com负责退出,用户点击退出后,sso清除本域Cookie和Redis缓存
- a服务和b服务在判断授权时,发现没Redis缓存,则清除本域Cookie,向sso服务再次请求授权,sso服务也没有Cookie则弹出登录页面。
遇到的一些问题:
- 如果Token被劫持或伪造怎么办?
Token中隐含了IP地址,即便劫持也只能要原来的机上使用,换到另外的机器则不行。
2.如果不同域(主域名不同)要实现单点登录怎么办?
解决办法:
第1种:登录成功后通过Http协议头部传递Token,跳转后,子应用从头部取出token再写cookie,
第2种:使用Oauth2协议实现
第3种:使用CAS