文档章节

springboot集成shiro框架(2)添加缓存

一直在成长的程序猿
 一直在成长的程序猿
发布于 2018/03/15 11:38
字数 721
阅读 1174
收藏 8

在集成shiro框架之后,每次在访问设置了权限的页面时,都会去执行doGetAuthorizationInfo方法来判断当前用户是否具备访问权限,由于在实际情况中,权限是不会经常改变的,所以进行缓存。

一、shiro缓存实现原理。

Shiro 提供了一系列让我们自己实现的接口,包括org.apache.shiro.cache.CacheManager 、org.apache.shiro.cache.Cache 等接口。那么我们要对这些做实现,就实现了 Shiro 对 Session 和用户认证信息、用户缓存信息等的缓存,存储。我们可以用缓存,如 Redis 、 memcache 、 EHCache 等,甚至我们可以用数据库,如 Oracle 、 Mysql 等,都可以,只有效率的快慢问题,功能都可以达到。

二、添加缓存

1、Ehcache缓存

    由于shiro默认集成了Ehcache缓存,所以这部分的配置比较简单。

   (1)生成EhCacheManager(org.apache.shiro.cache.ehcache.EhCacheManager)bean。

/*
EhcacheManager
 */
public EhCacheManager ehCacheManager(){
    EhCacheManager ehCacheManager = new EhCacheManager();
    //配置Ehcache缓存配置文件,该缓存配置文件默认位置为“classpath:org/apache/shiro/cache/ehcache/ehcache.xml”
    //ehCacheManager.setCacheManagerConfigFile(FileLocation) 
    return ehCacheManager;
}

    (2)将其注入SecurityManager中,此时即已经集成Ehcache缓存。

@Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //设置realm
        securityManager.setRealm(myShiroRealm());
        //注入缓存管理器
        securityManager.setCacheManager(ehCacheManager());
//        //注入sessionDao
//        securityManager.setSessionManager(SessionManager());

        return securityManager;
    }

tip:在配置Ehcache缓存的时候碰到一个问题,配置的缓存不生效,且登录之后一旦访问访问需要权限的目录就回跳转至登录页面。

在调试排查之后发现,是由于我之前配置了

<!-- redis实现session共享 -->
<!--<dependency>-->
   <!--<groupId>org.springframework.session</groupId>-->
   <!--<artifactId>spring-session-data-redis</artifactId>-->
<!--</dependency>-->

此依赖的作用为redis的session存储,之前的问题是由于此依赖的影响。移除此依赖后,缓存生效。

2、Redis缓存

这里我们就需要自定义实现SessionDao,Cache,CacheManager接口,这一部分其他人早已经做过,我们可以直接拿过来用。

(1)配置依赖

<!-- shiro+redis缓存插件 -->
<dependency>
   <groupId>org.crazycake</groupId>
   <artifactId>shiro-redis</artifactId>
   <version>2.4.2.1-RELEASE</version>
</dependency>

(2)配置config类

//redisManager,包含一个jedisPool,提供jedisClient用来连接redis
public RedisManager redisManager(){
    RedisManager redisManager = new RedisManager();
    redisManager.setHost("127.0.0.1");
    redisManager.setPort(6379);
    redisManager.setExpire(1800);// 配置过期时间
    // redisManager.setTimeout(timeout);
    // redisManager.setPassword(password);
    return redisManager;
}

/**
 * cacheManager 缓存 redis实现
 *
 * @return
 */
public RedisCacheManager cacheManager() {
    RedisCacheManager redisCacheManager = new RedisCacheManager();
    redisCacheManager.setRedisManager(redisManager());
    return redisCacheManager;
}

/**
 * RedisSessionDAO shiro sessionDao层的实现 通过redis
 */
public RedisSessionDAO redisSessionDAO() {
    RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
    redisSessionDAO.setRedisManager(redisManager());
    return redisSessionDAO;
}
/**
 * shiro session的管理
 */
public DefaultWebSessionManager SessionManager() {
    DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
    sessionManager.setSessionDAO(redisSessionDAO());
    return sessionManager;
}

(3)将RedisCacheManager和DefaultWebSessionManager注入SecurityManager

@Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //设置realm
        securityManager.setRealm(myShiroRealm());
        //注入缓存管理器
        securityManager.setCacheManager(cacheManager());
        //注入sessionDao
        securityManager.setSessionManager(SessionManager());

        return securityManager;
    }

此时,redis缓存已经集成完毕。

三、测试缓存是否配置成功

访问权限资源,当连续访问多次,doGetAuthorizationInfo只执行一次时,缓存配置成功。

 

以上只是最简单的缓存配置,后续计划实现session通过redis集群共享,Ehcache+redis二级缓存实现。

© 著作权归作者所有

一直在成长的程序猿
粉丝 8
博文 24
码字总数 11487
作品 0
海淀
私信 提问
加载中

评论(2)

一直在成长的程序猿
一直在成长的程序猿 博主

引用来自“繁华-落幕”的评论

遇到过 Method securityManager in org.apache.shiro.spring.boot.autoconfigure.ShiroAutoConfiguration required a bean named 'authenticator' that could not be found.
这个异常吗
没有碰到过
淡若悠然
遇到过 Method securityManager in org.apache.shiro.spring.boot.autoconfigure.ShiroAutoConfiguration required a bean named 'authenticator' that could not be found.
这个异常吗
SpringBootBucket 1.0.0 发布,SprintBoot 全家桶

Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。 本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通过“一...

一刀
2018/03/05
8.8K
17
Spring Boot 全家桶 - SpringBootBucket

Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。 本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通过“一...

一刀
2018/03/05
11.3K
8
SpringBootBucket 2.0.4 发布,代号“傲娇的小二晶”

SpringBootBucket 自从1.0.0版本发布后就有好多人喜欢,目前码云上面star数量接近1.2k。上个月还收到了红薯签名的1000 star奖杯,这个我自己也觉得很惊讶。 由于SpringBoot 1.x官方将终止维护...

一刀
2018/09/16
2.8K
4
springboot + shiro 权限注解、请求乱码解决、统一异常处理

springboot + shiro 权限注解、请求乱码解决、统一异常处理 前篇 后台权限管理系统 相关: spring boot + mybatis + layui + shiro后台权限管理系统 springboot + shiro之登录人数限制、登录...

wyait
2018/06/06
0
0
shiro中部分SpringCache失效问题

1、问题抛出 今天在做Springboot和shiro集成时,发现一个严重的问题。部分service的缓存和事务失效,debug代码时,发现这些有问题的service实例都不是代理生成的,所以事务和缓存就失效了(事...

夏日的雪花
2018/07/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

postman批量测试

postman批量调用: 先单个调用,成功了 再save为collection 再点击三角形,点击run 设置1000次,run就可以 见《postman批量测试.docx》

Danni3
37分钟前
8
0
js 对象操作 js 对象和对象赋值 去除关联性 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象

当我们在项目需要 复制一个对象到另一个对象并且 被复制的对象不能受复制后的对象的影响。 我先总结下 我们哪些方法可以复制对象 // 直接赋值var obj1 = { a: 1 };var obj2 = obj1;...

xiaogg
38分钟前
7
0
Go微服务全链路跟踪详解

在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪。 它的原理很简单,你可以在每个请求开始时生成一个唯一的ID,并将其传递到整个调用链。 该ID称为C...

倚天码农
52分钟前
9
0
QML笔记-对QML中信号与槽的基本认识

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq78442761/article/details/90753986 目录 基本概念 演示...

shzwork
59分钟前
5
0
SSH安全加强两步走

从 OpenSSH 6.2 开始已经支持 SSH 多因素认证,本文就来讲讲如何在 OpenSSH 下启用该特性。 OpenSSH 6.2 以后的版本多了一个配置项 AuthenticationMethods。该配置项可以让 OpenSSH 同时指定...

xiangyunyan
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部