之前我们的token都是保存在内存中。这是不合理的。【反正教程是这么写的】,可能是他的token有别于jwt的token吧。因为每次重启服务器就失效了嘛。。那就应该是临时token了。。
这里我们就把他的资源访问token进行缓存redis
maven:
redis依赖:
spring-boot-starter-data-redis
对象池依赖:
commons-pool2
原因:
放在内存中token有可能丢失,放关系数据库,效率低,所以采用redis
;
配置:
在刚才配置密码模式的地方,进行配置
在授权管理器后方.tokenStore()
;里面需要一个tokenStore
;我们去配置一个!
创建一个RedsiConfig配置类,在里面返回一个@Bean=>TokenStore;配置这个需要一个redis连接工厂 我们直接注入进来,RedisConnectionFactory
;
然后我们new 一个RedisTokenStore,将连接工厂给他。让他返回
【security本身就准备了这个RedisTokenStore,已经准备好了我们给他一个连接工厂】
@Configuration
public class RedisConfig {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public TokenStore redisTokenStore(){
return new RedisTokenStore(redisConnectionFactory);
}
}
然后回到我们刚才配置密码模式的地方将tokenStore
注入进来并交给他
/**
* 密码模式配置
* @param endpoints
* @throws Exception
*/
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
//自定义登录逻辑,我们把之前自定义的登录逻辑类注进来填进去(实现UserDetailService的类)
.userDetailsService(userDetailsService)
//配置授权管理器
.authenticationManager(authenticationManager)
//redis保存token配置
.tokenStore(tokenStore);
;
}
到这就完成了。token信息就会保存在redis;
这里会有一个坑
这里是由于低版本的redis并不能很好的支持oauth2的redis。需要升级oauth的版本,但是由于oauth会经过springboot的二次封装,又变回springboot的版本。。这里有两个解决办法,
1;提升boot版本号
2;屏蔽boot中的版本。另外导入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
如果提升boot版本后依然不行,直接引入2.3.3版本