分布式系统会话和单点登录

(分布式)会话

session共享,跨域访问
会话包括有状态和无状态,
有状态就是服务器开启一块内存来放session资源,这种方式比较传统,对服务器占用的资源比较大;
如果我们使用动静分离或者集群分布式系统的话,就是无状态的会话(单机tomcat内部使用jsp是可以有状态的),要弥补无状态我们可以通过cookie+redis来实现。
http本身无状态,通过外加一个介质的形式实现,介质包括cookie外加redis(session)

会话类型

https://class.imooc.com/lesson/1230#mid=29253

拦截器

接口鉴权 一般都是用 intercepter 拦截器

为了规范用户权限,防止个人信息被其他用户篡改,我们可以通过拦截器来解决这样的问题,它也是和我们的用户会话相关联的,我们只需要去判断用户的会话是不是一致就可以了,可以基于token去判断。
image
用户校验信息放到头里面,不放到请求对象里面,和业务有一定的隔离,降低一定的耦合度

单点登录

同顶级域名单点登录

同个产品下不同域名或子产品登录后其他域名都可以实现免登录,就是单点登录
https://class.imooc.com/lesson/1230#mid=29257
Cookie+Redis实现SSO
1、顶级域名www.imooc.com和*.imooc.com的cookie是可以被共享的
2、二级域名自己独立的cookie是不能共享的,如music.imooc.com的cookie不能被mtv.imooc.com共享,两者互不影响,要共享必须设置为.imooc.com
image

CAS不同顶级域名单点登录

https://class.imooc.com/lesson/1230#mid=29258
看起来全局票据的作用就是隐藏用户的id的

SSO或者CAS如何做到保存全局门票?
在用户访问的SSO或者CAS中,将全局门票存储cookie。由于用户不管访问什么完整都需要访问SSO或者CAS,所以都能拿到cookie。如此来实现单点登录。
那已经有了全局门票,临时门票怎么做到保证用户的安全性了?
所以整个流程的关键点就在,所有页面访问都会去访问同一个SSO或者CAS网站,这个网站的可操作内容就比较多了

流程图

image

为什么设计全局和临时票据

你好,在CAS协议中,是需要根据全局门票去获取临时票据。然后再根据获取到的临时票据获取用户会话。因为用户会话是用户在业务系统中重要的凭证,如果根据全局门票就能直接获取到用户会话其实是很危险的。
我认为临时票据这个设计的精妙之处在于以下两点:

一、提高系统的安全性。我们服务器传临时票据给业务系统是通过“重定向”将临时票据带出去给业务系统的。如果我们在重定向之前对 returnUrl 的合法性进行校验(属于公司的地址才重定向),就能在一定程度上保证安全,因为是重定向到我们公司自己的地址。即使全局门票被泄露了,别人也无法轻易根据全局门票拿到临时票据,也就无法拿到用户的会话这种敏感信息。
二、单一职责。全局门票负责标识用户在CAS登录过。临时票据用于获取用户的会话信息。

全局票据, 可以进行判断用户是否异地登陆或者更改设备, 如果有更改就让全局票据限制;
临时票据, 可以控制此次会话的,退出或者长时间未操作,可以用临时票据控制;

顶级域名的登出

在顶级域名不同的系统下;
某一个域名点击退出登录后, 其他的域名不受影响(其他域名的cookie没有被删除);

但是这问题不大,当其他域名与后端进行交互的时候,会被拦截器拦截(redis中token失效);
然后再次提醒用户做一个登陆的操作

复习

https://class.imooc.com/lesson/1230#mid=29259

分布式系统CAP

posted @ 2023-10-23 18:58  bePatient  阅读(61)  评论(0)    收藏  举报