簡介:由於考慮到項目后期分布式部署,所以緩存由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緩存(四)
