使用 Redis
在 15.5.2.1 小节塔建授权服务器时,我们配置将生成的令牌 Access Token 存在内存中,当时提供的 TokenStore 实例是 InMemoryTokenStore:
@Configuration
public class AccessTokenConfig {
@Bean
TokenStore tokenStore() {
return new InMemoryTokenStore();
}
}
事实上,TokenStore 接口有多种不同的实现类,如图15-17所示

可以看到,我们有多种方式来存储 Access Token:
-
InMemoryTokenStore:这是我们之前使用的方式,即将 Access Token 存到内存中,单机使用这个没有问题,但是在分布式环境下不推荐使用。
-
JdbcTokenStore:将 Access Token 保存到数据中,方便和其他应用共享令牌信息。
-
JwtTokenStore:这个其实不算是存储,因为使用了 JWT 之后,在生成的 JWT 中就有用户的所有信息,服务端不需要保存。
-
RedisTokenStore:将 Access Token 存到 Redis 中。
-
JwkTokenStore:这个只在资源服务器上使用,主要作用是解码 JWT 并使用相应的 JWK 验证其签名(JWS)。
虽然这里支持的方案比较多,但是我们常用的方案实际上主要是这两个:RedisTokenStore 和 JwtTokenStore,JwtTokenStore 后面会做介绍,这里我们门先来看一下 RedisTokenStore。
首先我们启动一个 Redis。
接下来在 15.5.2.1 小节搭建的授权服务器基础上,添加 Redis 依赖,代码如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
然后在 application.properties 中添加 Redis 配置:
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123
配置完成后,我们修改 TokenStore 的实例,代码如下:
@Configuration
public class AccessTokenConfig {
@Autowired
RedisConnectionFactory redisConnectionFactory;
@Bean
TokenStore tokenStore() {
return new RedisTokenStore(redisConnectionFactory);
}
}
只需要修改一下 TokenStore 实例即可。
配置完成后,再去启动 auth_server,此时授权服务器生成的 Access Token 令牌就会保存到 Redis 中。Access Token 在 Redis 中的有效期就是令牌的有效期,也正是因为 Redis 中的这种过期机制,让它在存储 Access Token 时具有天然的优势。