使用场景
面对现在市场上比较火的架构风格:微服务,使得我们在登录方面有所顾虑,当我们在一个模块中登录,到了另外一个模块,因为另外一个模块可能部署在其他的服务器上,导致我们可能一个模块要进行一次登录,这是不可取的,我们想要的效果是在一个项目中,多个模块中只需要在其中一个模块登录一次然后就可以实现所有模块的访问,也就是单点登录。
使用cookie+redis实现
1、当我们在项目中的一个模块进行登录时,会把数据放到cookie和redis当中。
-
redis(基于key-value存储)
在key中生成唯一的值(可以是ip地址、用户id、uid等,根据需要决定)
在value中存放用户数据 -
cookie
将redis里面的key值放到cookie中
2、当我们访问项目其他模块时,发送请求会带上cookie,获取cookie的值,拿到值在redis进行查询,查询到数据即登录成功,若查询不到,则进行登录,然后继续第一步的操作。
使用token(令牌)实现
token:按照一定规则生成字符串,字符串可以包含用户信息。
现在常用的规则是使用JWT生成字符串。
1、当我们在项目中的一个模块进行登录时,会把用户数据按照规则生成字符串,然后返回字符串
- 可以将字符串通过cookie返回
- 可以将字符串通过地址栏返回
- 可以将字符串放到请求头返回
2、当我们访问项目其他模块时,根据上述不同形式的返回去获取到token字符串,根据字符串的规则去尝试获取用户信息,如果获取到,则登录成功,获取不到则进行登录,重复第一步的操作。
JWT
JWT简介
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准,该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。
JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
JWT生成的字符串包含三部分
- jwt头信息
- 有效载荷(用户信息)
- 签名哈希(防伪标志)
项目整合JWT
引入依赖
<dependencies>
<!-- JWT-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
</dependencies>
<properties>
<jwt.version>0.7.0</jwt.version>
</properties>
导入工具类,工具类格式都是固定的