简介:由于考虑到项目后期分布式部署,所以缓存由ehcache改为redis,而redis既有单机版部署,也有分布式部署,所以二者需要兼容。
1. maven依赖
<dependency>
<groupId>org.crazycake</groupId>
<artifactId>shiro-redis</artifactId>
<version>3.1.0</version>
</dependency>
2. 设置缓存管理器,此处开启授权缓存,并加入securityManager中
@Value("${spring.redis.cluster.nodes:}")
private String nodes;
@Value("${spring.redis.host:}")
private String host;
@Value("${spring.redis.port:6379}")
private int port; /**
* redis集群管理器
*
* @return redisClusterManager
*/
@Bean
public RedisClusterManager redisClusterManager() {
RedisClusterManager redisClusterManager = new RedisClusterManager();
redisClusterManager.setHost(this.nodes);
return redisClusterManager;
}
/**
* redis管理器
*
* @return redisManager
*/
@Bean
public RedisManager redisManager() {
RedisManager redisManager = new RedisManager();
redisManager.setHost(this.host);
redisManager.setPort(this.port);
return redisManager;
}
/**
* redis缓存管理器
*
* @param redisClusterManager redis集群管理器
* @param redisManager redis管理器
* @return cacheManager
*/
@Bean
public RedisCacheManager redisCacheManager(RedisClusterManager redisClusterManager, RedisManager redisManager) {
RedisCacheManager redisCacheManager = new RedisCacheManager();
redisCacheManager.setRedisManager(StrUtil.isNotBlank(this.nodes) ? redisClusterManager : redisManager);
// 针对不同的用户缓存,由于principal是ShiroUser,所以需是里面的字段
redisCacheManager.setPrincipalIdFieldName("id");
redisCacheManager.setExpire((int) CommonConstant.PERMISSION_TIME);
return redisCacheManager;
}
/**
* token认证和授权验证器
*
* @param redisCacheManager 缓存管理器
* @return jwtRealm
*/
@Bean
public JwtRealm jwtRealm(RedisCacheManager redisCacheManager) {
JwtRealm jwtRealm = new JwtRealm();
jwtRealm.setCredentialsMatcher(new JwtCredentialsMatcher());
// 启用授权缓存
jwtRealm.setAuthorizationCachingEnabled(true);
jwtRealm.setAuthorizationCacheName(RedisConstant.AUTHORIZATION_CACHE);
jwtRealm.setCacheManager(redisCacheManager);
return jwtRealm;
}
3. JwtRealm类集令牌token认证和授权认证,考虑到用户的权限会更改,所以在更改权限时需要清除授权缓存
注意点:本处代码没有调用shiro自带的清除缓存方法,是由于项目引入的jedis是3.1版本,而shiro-redis里用的jedis是低版本不兼容,所以直接调用后会报错,故需要自己实现清除。
4. 常见错误见:SpringBoot整合Shiro 集成Ehcache缓存(四)