前言

在 shiro 中每次去拦截请求进行权限认证的时候,都会去数据库查询该用户的所有权限信息, 这个时候就是有一个问题了,因为用户的权限信息在短时间内是不可变的,每次查询出来的数据其实都是重复数据,没必要每次都去重新获取这个数据,统一放在缓存中进行管理,这个时候,我们只需要获取一次权限信息,存入到缓存中,待缓存过期后,再次重新获取即可。

例如,我执行一个查询多次,它执行多次权限查询。

使用 Reids 缓存

加入 shiro-redis 依赖

  1. <!-- shiro-redis -->
  2. <dependency>
  3. <groupId>org.crazycake</groupId>
  4. <artifactId>shiro-redis</artifactId>
  5. <version>2.4.2.1-RELEASE</version>
  6. </dependency>

配置 Redis

和前面系统配置 Reids 一样。

1. 在系统配置文件中加入 Redis 配置参数:

  1. spring:
  2. redis:
  3. host: 192.168.19.200 # host ,默认 localhost
  4. port: 6379 # 端口号,默认6379
  5. pool:
  6. # 设置都是默认值,可以按需求设计
  7. max-active: 8 # 可用连接实例的最大数目,默认值为8;如果赋值为-1,则表示不限制;
  8. max-idle: 8 # 控制一个pool最多有多少个状态为idle(空闲的)的redis实例,默认值也是8。
  9. max-wait: -1 # 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。
  10. min-idle: 0 # 控制一个pool最少有多少个状态为idle(空闲的)的redis实例,默认值为0。
  11. timeout: 0 # 连接超时时间 单位 ms,默认为0
  12. password: master # 密码,根据自己的 redis 设计,默认为空
  1. 这个我们是要使用 RedisManager 管理我们的 Redis,它默认没有注入我们设置的这些参数,需要我们自己手动创建一个注入我们设置的参数。
  1. @ConfigurationProperties(prefix = "spring.redis")
  2. public class CustomRedisManager extends RedisManager {
  3. }

配置 Shiro 缓存

  1. /**
  2. * redis 管理
  3. */
  4. @Bean
  5. public CustomRedisManager customRedisManager() {
  6. return new CustomRedisManager();
  7. }
  8. /**
  9. * redis 缓存
  10. */
  11. @Bean
  12. public RedisCacheManager cacheManager(CustomRedisManager redisManager) {
  13. RedisCacheManager redisCacheManager = new RedisCacheManager();
  14. redisCacheManager.setRedisManager(redisManager);
  15. return redisCacheManager;
  16. }
  17. @Bean
  18. public SecurityManager securityManager(OAuth2Realm oAuth2Realm, SessionManager sessionManager, RedisCacheManager cacheManager) {
  19. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  20. // 可以添加多个认证,执行顺序是有影响的
  21. securityManager.setRealm(oAuth2Realm);
  22. securityManager.setSessionManager(sessionManager);
  23. // 注册 缓存
  24. securityManager.setCacheManager(cacheManager);
  25. return securityManager;
  26. }

使用测试

我们加入缓存后,看是个什么情况:

执行多次请求,只执行了一次查询权限的 SQL。

可以去 redis-cli 查看 keys,检查是否存在权限对象的 key。

使用 Ehcache 缓存

加入依赖

  1. <!-- shiro ehcache -->
  2. <dependency>
  3. <groupId>org.apache.shiro</groupId>
  4. <artifactId>shiro-ehcache</artifactId>
  5. <version>1.3.2</version>
  6. </dependency>
  7. <!-- ehchache -->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-cache</artifactId>
  11. </dependency>
  12. <dependency>
  13. <groupId>net.sf.ehcache</groupId>
  14. <artifactId>ehcache</artifactId>
  15. </dependency>

Ehcache 配置

新增一个 Ehcache 配置文件 shiro-ehcache.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
  4. updateCheck="false">
  5. <diskStore path="java.io.tmpdir/Tmp_EhCache" />
  6. <defaultCache
  7. maxElementsInMemory="10000"
  8. eternal="false"
  9. timeToIdleSeconds="120"
  10. timeToLiveSeconds="120"
  11. overflowToDisk="false"
  12. diskPersistent="false"
  13. diskExpiryThreadIntervalSeconds="120" />
  14. <!-- 登录记录缓存锁定1小时 -->
  15. <cache
  16. name="passwordRetryCache"
  17. maxEntriesLocalHeap="2000"
  18. eternal="false"
  19. timeToIdleSeconds="3600"
  20. timeToLiveSeconds="0"
  21. overflowToDisk="false"
  22. statistics="true" />
  23. </ehcache>

配置 EhCache 缓存

  1. /**
  2. * EhCache 缓存
  3. */
  4. @Bean
  5. public EhCacheManager ehCacheManager() {
  6. EhCacheManager em = new EhCacheManager();
  7. em.setCacheManagerConfigFile("classpath:config/shiro-ehcache.xml");
  8. return em;
  9. }
  10. @Bean
  11. public SecurityManager securityManager(OAuth2Realm oAuth2Realm, SessionManager sessionManager,
  12. RedisCacheManager cacheManager, EhCacheManager ehCacheManager) {
  13. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  14. // 可以添加多个认证,执行顺序是有影响的
  15. securityManager.setRealm(oAuth2Realm);
  16. securityManager.setSessionManager(sessionManager);
  17. // 设置缓存
  18. securityManager.setCacheManager(ehCacheManager);
  19. return securityManager;
  20. }

参考文章

学习Spring Boot:(十九)Shiro 中使用缓存的更多相关文章

  1. spring Boot(十九):使用Spring Boot Actuator监控应用

    spring Boot(十九):使用Spring Boot Actuator监控应用 微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台 ...

  2. spring boot(十四)shiro登录认证与权限管理

    这篇文章我们来学习如何使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求.在Java领域一般有Spring Security ...

  3. (转)Spring Boot (十九):使用 Spring Boot Actuator 监控应用

    http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html 微服务的特点决定了功能模块的部署是分布式的,大部分功能 ...

  4. 学习Spring Boot:(二十六)使用 RabbitMQ 消息队列

    前言 前面学习了 RabbitMQ 基础,现在主要记录下学习 Spring Boot 整合 RabbitMQ ,调用它的 API ,以及中间使用的相关功能的记录. 相关的可以去我的博客/RabbitM ...

  5. 学习Spring Boot:(二十五)使用 Redis 实现数据缓存

    前言 由于 Ehcache 存在于单个 java 程序的进程中,无法满足多个程序分布式的情况,需要将多个服务器的缓存集中起来进行管理,需要一个缓存的寄存器,这里使用的是 Redis. 正文 当应用程序 ...

  6. 学习 Spring Boot 知识看这一篇就够了

    从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区.我的博客和我的公号内.粗略的统计了一下总共的文章加起来大概有六十多篇了,其 ...

  7. (转)Spring Boot (十四): Spring Boot 整合 Shiro-登录认证和权限管理

    http://www.ityouknow.com/springboot/2017/06/26/spring-boot-shiro.html 这篇文章我们来学习如何使用 Spring Boot 集成 A ...

  8. Spring Boot(十四):spring boot整合shiro-登录认证和权限管理

    Spring Boot(十四):spring boot整合shiro-登录认证和权限管理 使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉 ...

  9. Spring Boot (十四): Spring Boot 整合 Shiro-登录认证和权限管理

    这篇文章我们来学习如何使用 Spring Boot 集成 Apache Shiro .安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求.在 Java 领域一般有 Spring S ...

随机推荐

  1. 20155320 EXP8 Web基础

    20155320 EXP8 Web基础 [基础问题回答] 什么是表单? 表单:可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 表单由文本域.复选框.单选框.菜单.文件地址域.按钮等 ...

  2. 汇编 if else

    知识点: if else 逆向还原代码 一.了解if else结构 sub esp, |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-] 0040102C |. 3B45 ...

  3. kali黑客渗透测试基础环境准备

    1.apt-get install python-nmap 2.apt-get install python-setuptools 正在读取软件包列表... 完成 正在分析软件包的依赖关系树      ...

  4. P2463 [SDOI2008]Sandy的卡片

    写一种\(O(nm)\)的做法,也就是\(O(\sum 串长)\)的. 先通过差分转化,把每个数变成这个数与上一个数的差,第一个数去掉,答案就是最长公共子串+1 按照套路把所有串拼起来,中间加一个分隔 ...

  5. [BZOJ4144][AMPPZ2014]Petrol[多源最短路+MST]

    题意 题目链接 分析 假设在 \(a \rightarrow b\) 的最短路径中出现了一个点 \(x\) 满足到 \(x\) 最近的点是 \(c\) ,那么我们完全可以从 \(a\) 直接走到 \( ...

  6. Asp.Net_Wcf跟Wpf的区别

    摘要:WCF,你就先把它想成WebService的下一代也没什么问题.WCF为WindowsCommunicationFoundation,是Microsoft为构建面向服务的应用提供的分布式通信编程 ...

  7. C# List left join

    public class Test1 { public int ID { get; set; } public string Name { get; set; } } public class Tes ...

  8. 由Windows开发平台向Linux平台转移的一些想法

    从毕业到现在已经快20年了,一直在从事Windows平台上的开发工作.刚毕业那会大约是97,98年左右,工作的平台除了Windows平台还有Dos平台,因为在学校学习时,也是从Dos开始的.因此对于从 ...

  9. 腾讯/阿里/百度 BAT人才体系的职位层级、薪酬、晋升标准

    互联网圈有这么一句话:百度的技术,阿里的运营,腾讯的产品.那么代表互联网三座大山的BAT,内部人才体系有什么区别呢?今天老李就带领大家看一看~ ★ 腾讯 ★   1. 职级 腾讯职级体系分6级,最低1 ...

  10. yocto-sumo源码解析(二): oe-buildenv-internal

    1 首先,脚本先对运行方式进行了检测: if ! $(return >/dev/null 2>&1) ; then echo 'oe-buildenv-internal: erro ...