当前位置: 首页 - 编程技术 - 文章正文

单点登录方案实战

xiaoqihv

单点登录 先介绍下:oauth2与单点登陆的区别session-cookie机制session共享方式,实现的单点登陆使用场景实现方法Session共享方式的限制 顶级域名不一样的网站怎么办?这时候就需要CAS登场了cas单点登陆方案

先介绍下:oauth2与单点登陆的区别

1、oauth2,不同的企业之间的登陆,例如:qq登录csdn,应用之间的信任度较低 2、单点登陆,是同一企业的产品系列(不同服务器上)间的登陆,相互信任度较高  

session-cookie机制

先上个原理图:   1、session-cookie机制出现的根源, http连接是无状态的连接 -------- 同一浏览器向服务端发送多次请求,服务器无法识别,哪些请求是同一个浏览器发出的

2、为了标识哪些请求是属于同一个人 ---------- 需要在请求里加一个标识参数 方法1-----------直接在url里加一个标识参数(对前端开发有侵入性),如: token 方法2-----------http请求时,自动携带浏览器的cookie(对前端开发无知觉),如:jsessionid=dfdfdfdfdf

3、浏览器标识在网络上的传输,是明文的,不安全的 -----------安全措施:改https来保障

4、cookie的使用限制—依赖域名 先介绍下各级域名: 一级域名:又叫顶级域名,一串字符串中间一个点隔开,例如baidu.com 二级域名:实际上就是一个一级域名以下的主机名,一串字符串中间两个“.”隔开,例如pan.baidu.com("pan"就是主机名)。 三级域名:二级域名的子域名,特征是包含三个“.”。

-------------- 顶级域名下cookie,会被二级以下的域名请求,自动携带 -------------- 二级域名的cookie,不能携带被其它域名下的请求携带

5、在服务器后台,通过解读标识信息(token或jsessionid),来对应会话是哪个session --------------- 一个tomcat,被1000个用户登陆,tomcat里一定有1000个session -------》存储格式map《sessionid,session对象》 --------------- 通过前端传递的jsessionid,来对应取的session ------ 动作发生时机request.getsession  

session共享方式,实现的单点登陆 使用场景

多个应用共用同一个顶级域名,sessionid被种在顶级域名的cookie里 用户登陆,注销了tomcat1,不要重复去操作tomcat2  

实现方法

1、后台session通过redis实现共享,即每个tomcat都在请求开始时,到redis查询session;在请求返回时,将自身session对象存入redis 2、后台判断请求是否已登陆,主要校验session对象中,是否存在登陆用户信息 3、可以自己实现,也可以用成熟的框架sping-session    

Session共享方式的限制

tomcat1,与tomcat2,tomcat3三台服务器,必须是同域名或者同顶级域名,才能拿到对应的cookie值  

顶级域名不一样的网站怎么办?

例如图中情况所示: 1、A请求a.com登陆成功,cookieA存在a.com域名下 2、B请求b.com服务时,无法携带存在a.com域名下cookieA 3、B服务发现无cookie,必然强制要求,去登陆,问题无解

这时候就需要CAS登场了 cas单点登陆方案

(1)b.com打开时,发现自己未登陆 ------ > 于是跳转到cas.com去登陆 (2)cas.com登陆页面被打开,用户输入帐户/密码登陆成功 (3)cas.com登陆成功,种cookie到cas.com域名下------ > 把sessionid放入后台redis<ticket,sesssionid>—页面携带ticket跳回b.com (4)b.com重新被打开,发现仍然是未登陆,但是有了一个ticket值 (5)b.com用ticket值,到redis里查到sessionid,并做session同步------ > 种cookie给自己,页面原地重跳 (6)b.com打开自己页面,此时有了cookie,后台校验登陆状态,成功

   整个过程交互,列图如下: (7)cas.com的登陆页面被打开时,如果此时cas.com本来就是登陆状态的,则自动返回生成ticket给业务系统 整个单点登陆的关键部位,是利用cas.com的cookie保持cas.com是登陆状态,此后任何第三个系统跳入,都将自动完成登陆过程

为提高安全性,ticket应该使用过即作废(本例中使用有效期机制)

文章地址:https://wenmayi.cn/post/390.html