开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):登录业务介绍(单点登录)】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11440
登录业务介绍(单点登录)
单点登录三种常见方式
单点登录(Single Sign On),简称为 SSO。
1. session 广播机制实现
什么叫广播?
展开想象:
有一个广场,广场上站了很多人,在前面一个人拿着喇叭对着所有人喊,他一喊其他人都可以听到,这个过程就是广播。
在我们程序中是如何实现这一过程的呢?
session 的广播机制通俗来讲就是 session 的复制。
什么叫复制?
还是这张图,在 service-edu 中登录之后把数据放到 session 这个对象中,里面存了用户信息。
用session广播机制把session对象复制到service-oss这一模块中,复制完成后再复制到service-cms这一模块中。
把登陆的session对象复制到其他模块中去,在每个模块中都有登录之后的session对象。
复制之后,这种登录就可以做到当第一个登陆里边有数据,第二个第三个也始终有数据,这个过程叫 session 复制。
如果项目里只有几个模块,那么做 session 复制就没有什么问题。
但是如果项目中有几十个模块, session 就要复制几十次,这对资源是极大的消耗,所以 session 广播机制并不适合多模块。
这是一种比较早期的方式,网络刚刚兴起的时候用户比较少,网络访问量不大,网速也比较慢,那个场景下使用session的复制机制完全可以做到。但是现在使用会造成数据重复,浪费空间的问题。
2. 使用 cookie+redis 实现
Cookie 是客户端技术,最终存到浏览器中。在浏览器中每次发送请求,会带着cookie 值进行发送,这是 cookie 的特点。
Redis是一个内存数据库 最大的优点是读取速度快,还有一个特点是基于 key value做存储:
[root
@
online bin]#/redis-cli
127.0.0.1:6379> keys *
1)"test4"
2)"test"
127.0.0.1:6379> get test
"[\"java.util.ArrayList\",[\"user.list\",\"user.add\","\"user,update\",\\"user.renove\",\"user assgin\"]]"
127.0.0.1:6379>
(1)项目中任何一个模块进行登录,登录之后,把数据放到两个地方:
l redis :在key中生成唯一或随机的值,在 value 中放用户数据
唯一值生成的的规则不确定,一般来讲根据 ip 地址,或者用户 id 等等
l cookie:把 redis 生成的 key 的值放到 cookie 里
(2) 访问项目中其他模块,发送请求带着 cookie 进行发送,获取 cookie 值,
拿着 cookie 做事情:
把 cookie 获取的值到 redis 根据 key 进行查询,如果能查出数据,表示已登录
3. 使用 token 实现
token 是什么?
*按照一定规则生成字符串,字符串可以包含用户信息
token 也叫令牌。
例如:字符串:192.1.1.1#lucy#2# 做个编码再做个加密
(1)在项目某个模块进行登录,登录之后,按照规则生成字符串,把登录之后
用户信息包含到生成的字符串中,把字符串返回
l 可以把字符串通过 cookie 返回
l 把字符串通过地址栏返回
(2)再去访问项目中其他模块,每次访问在地址栏都带着生成的字符串,在访
问模块里获取地址栏字符串,根据字符串获取用户信息,如果可以获取,就是登
录。
Session 默认的过期时间是30分钟。第二步第三步中没有 session,但是可以做到,要如何做呢?
Redis 是有过期时间的,可以通过设置redis过期时间做到和 session 一样的效果。Token 也可以设置。