Java安全框架——Apache Shiro(二十七)

57 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

【2】注解原理分析

【2.1】装载过程

【2.2】调用过程

第六章 Realm缓存机制

1、Realm缓存机制意义

在上面我们自定了自己的realm,但是我们发现

在认证和授权的时候,程序需要频繁的访问数据库,这样对于数据库的压力可想而知,那我们怎么处理呢?

2、Realm缓存机制实现思路

【1】缓存机制

【2】原理分析

此时我们对UserBridgeServiceImpl的实现类里面的逻辑加入了自定义的SimpleCacheService缓存服务接口,简单来说实现了在认证和鉴权时不需要每次都去查询数据库,而是把认证和鉴权信息放入到redis缓存中,以减低数据库的访问压力

1、集成redis服务器,作为集中存储认证和鉴权信息
2、改写UserBridgeServiceImpl使其优先从缓存中读取

3、redission集成

【1】添加ShiroRedisProperties

此类主要负责yaml文件的配置类

package com.itheima.shiro.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.io.Serializable;

/**
* @Description  redis配置文件
*/
@Data
@ConfigurationProperties(prefix = "itheima.framework.shiro.redis")
public class ShiroRedisProperties implements Serializable {

    /**
* redis连接地址
*/
private String nodes ;

    /**
* 获取连接超时时间
*/
private int connectTimeout ;

    /**
* 连接池大小
*/
private int connectPoolSize;

    /**
* 初始化连接数
*/
private int connectionMinimumidleSize ;

    /**
* 等待数据返回超时时间
*/
private int timeout ;

    /**
*  全局超时时间
*/
private long globalSessionTimeout;

}

【2】编辑ShiroConfig

集成redisson的相关配置,同时启用ShiroRedisProperties的配置

package com.itheima.shiro.config;  
  
  
import com.itheima.shiro.core.ShiroDbRealm;  
import com.itheima.shiro.core.impl.ShiroDbRealmImpl;  
import com.itheima.shiro.filter.RolesOrAuthorizationFilter;  
import com.itheima.shiro.properties.PropertiesUtil;  
import lombok.extern.log4j.Log4j2;  
import org.apache.shiro.spring.LifecycleBeanPostProcessor;  
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;  
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;  
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;  
import org.apache.shiro.web.servlet.SimpleCookie;  
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;  
import org.redisson.Redisson;  
import org.redisson.api.RedissonClient;  
import org.redisson.config.Config;  
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.boot.context.properties.EnableConfigurationProperties;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.ComponentScan;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.context.annotation.DependsOn;  
  
import javax.servlet.Filter;  
import java.util.HashMap;  
import java.util.LinkedHashMap;  
import java.util.List;  
import java.util.Map;  
  
/**  
 * @Description 权限配置类  
 */  
@Configuration  
@ComponentScan(basePackages = "com.itheima.shiro.core")  
@EnableConfigurationProperties({ShiroRedisProperties.class})  
@Log4j2  
public class ShiroConfig {  
  
    @Autowired  
    private ShiroRedisProperties shiroRedisProperties;  
  
    /**  
     * @Description redission客户端  
     */  
    @Bean("redissonClientForShiro")  
    public RedissonClient redissonClient() {  
        log.info("=====初始化redissonClientForShiro开始======");  
        String[] nodeList = shiroRedisProperties.getNodes().split(",");  
        Config config = new Config();  
        if (nodeList.length == 1) {  
            config.useSingleServer().setAddress(nodeList[0])  
                    .setConnectTimeout(shiroRedisProperties.getConnectTimeout())  
                    .setConnectionMinimumIdleSize(shiroRedisProperties.getConnectionMinimumidleSize())  
                    .setConnectionPoolSize(shiroRedisProperties.getConnectPoolSize()).setTimeout(shiroRedisProperties.getTimeout());  
        } else {  
            config.useClusterServers().addNodeAddress(nodeList)  
                    .setConnectTimeout(shiroRedisProperties.getConnectTimeout())  
                    .setMasterConnectionMinimumIdleSize(shiroRedisProperties.getConnectionMinimumidleSize())  
                    .setMasterConnectionPoolSize(shiroRedisProperties.getConnectPoolSize()).setTimeout(shiroRedisProperties.getTimeout());  
        }  
        RedissonClient redissonClient =  Redisson.create(config);  
        log.info("=====初始化redissonClientForShiro完成======");  
        return redissonClient;  
    }