简介:由于考虑到项目后期分布式部署,所以缓存由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缓存(四)
 
  
  
  
 
 
  
 