简介
说明
本文用实例介绍shiro通过引入shiro-redis来缓存权限。使用SpringBoot整合Shiro。
- 本文是在这篇文章基础上添加缓存功能:
- 尽量使用原生的shiro配置,尽量少自定义配置。
- 我自己自测通过,代码可用。
shiro用法我写了一个系列,有如下文章:
- Shiro整合jwt-通过注解控制权限 – 自学精灵
- Shiro整合jwt-通过url控制权限 – 自学精灵
- Shiro整合Session-通过注解控制权限 – 自学精灵
- Shiro整合shiro-redis – 自学精灵
使用形式
- 使用Shiro默认的session来管理权限。
- 使用角色和资源权限两种方式。(注解的方式)
- 使用Shiro默认的过滤器。
- 使用Knife4j测试(Swagger的升级版)。
- 使用shiro-redis做缓存:shiro-redis-spring-boot-starter
技术栈
- shiro-redis-spring-boot-starter:3.3.1
- spring-boot-starter-parent:2.3.8.RELEASE
- mysql:8.0
- mybatis-plus-boot-starter:3.4.3.1(持久层框架)
- lombok(简化代码)
- knife4j-spring-boot-starter:3.0.3(接口文档(swagger的升级版))
业务场景
本文假设做一个商城系统。
角色如下
- admin有所有权限
- productManager有所有product的权限
- orderManager有所有order的权限
用户密码及权限如下
用户 | 密码 | 角色 | 拥有的权限 |
zhang3 | 12345 | admin | 所有权限 |
li4 | abcde | productManager | 产品的所有权限 |
shiro-redis简介
shiro-redis
官方github:https://github.com/alexxiyang/shiro-redis
官方gitee:https://gitee.com/BYSRepo/shiro-redis
官网教程:https://github.com/alexxiyang/shiro-redis/blob/master/docs/README.md
shiro-redis-spring-boot-starter
Starter (将shiro-redis与springboot整合,使用更方便)
官网教程:shiro-redis/README.md at master · alexxiyang/shiro-redis · GitHub
mvn仓库(在mvn仓库直接搜名字搜不到,我是搜groupId搜到的。。。)
简介
Shiro官方只支持EHCache和concurrentHashMap这两种缓存,不支持Redis。幸运的是,有大佬已经写了支持Redis的组件–Shiro-Redis。
shiro-redis-spring-boot-starter:跟shiro-redis一个东西,只不过将shiro-redis与springboot整合,使用更方便(可以将配置写到application.yml)。它内部引入了这些包:spring-boot-autoconfigure、shiro-redis、shiro-spring-boot-web-starter。
结果展示
访问:http://localhost:8080/doc.html

查看Redis(啥都没有)

测试产品管理员(productManager)
1.测试登录
- 登录成功
- 可以看到,会返回来一个JSESSIONID。
- Session被存到了Redis中。


2.测试有资源权限的接口
本处测试增加产品接口。
- 成功访问。
- 在请求时会传递cookie(JSSESSIONID)
- Session的时间会被刷新。
- 资源权限被写到缓存中。



3.测试无资源权限的接口
本处测试增加订单接口。
- 访问失败。
- 在请求时会传递cookie(JSSESSIONID)
- Session的时间会被刷新。(虽然无权限,但是通过了身份认证呀)


4.测试有角色权限的接口
本处测试编辑订单接口。
- 访问失败。
- 在请求时会传递cookie(JSSESSIONID)
- Session的时间会被刷新。


5.测试无角色权限的接口
本处测试删除订单接口。
- 访问失败。
- 在请求时会传递cookie(JSSESSIONID)
- Session的时间会被刷新。(虽然无权限,但是通过了身份认证呀)


6.登出
登出后,Redis里的Session、资源权限都被删除。


7.请求有权限的接口
本处测试增加产品接口。
- 请求失败
- 跳转到loginUrl指定的地址(本处是/login)
- Session会被存到Redis。


重启服务再请求
请求之前(Redis里边没东西)

1.登录
- 登录成功
- session被存到了Redis中


2.重启服务器
重启Idea启动的应用。
3.访问有权限的接口
本处访问产品增加接口。
- 访问成功。
- 访问之后,Session的时间会刷新。

Redis结果

请先
!