整合mybatis
pom
依赖
1 | <!--mybatis--> |
逆向工程插件
1 | <!--mybatis 逆向工程--> |
yml
1 | spring: |
事务
1 | 1. 在springboot启动类上加 @EnableTransactionManagement |
测试
测试controller
1 | package machine.mybootdo; |
开发准备
1 | 1. 逆向工程: |
API管理
/index:跳转管理页面;加载菜单${menus};
1. 登录(shiro认证)
流程:
1 | subject.login(token); |
pom
1 | <!--shiro--> |
表
sys_user
1 | -- ---------------------------- |
dao mapper domain
方法:list
UserDO UserDao UserMapper
ShiroConfig
1 | package machine.mybootdo.system.config; |
UserRealm
1 | package machine.mybootdo.system.shiro; |
utils
ApplicationContextRegister
getbean方法
R
表单提交 状态返回
controller
LoginController.ajaxLogin
1 | ("/login") |
ui
ajax post提交 参数:username password
2. 加载菜单列表(用户角色菜单)
根据用户id加载用户可操作的菜单列表
表
1 | sys_user |
1 | -- ---------------------------- |
dao mapper domain
方法:listMenuByUserId
MenuDO
MenuDao
1 | List<MenuDO> listMenuByUserId(Long id); |
MenuMapper.xml
1 | <select id="listMenuByUserId" resultType="machine.mybootdo.system.domain.MenuDO"> |
说明:
1 | -- 以上sql:列出某个用户所拥有的全部菜单操作 |
service
@Transactional(readOnly = true,rollbackFor = Exception.class)
MenuService
1 | @Override |
controller
LoginController extends BaseController
1 | @GetMapping("/index") |
utils
fastjson
1 | <dependency> |
Tree
菜单树
BuildTree
buildList方法 构建菜单树
ShiroUtils
BaseController
ui
1 | <li th:each="menu : ${menus}"> |
1 | select distinct |
3. shiro+缓存
给shiro配置缓存,用户操作时会多次查询认证信息,只需要首次查数据库,之后都从缓存取,减少数据库查询次数,提高效率
前置知识:
springboot+redis+jedis操作
pom
1 | <!--redis--> |
配置:
1 | spring: |
操作类 RedisManager
1 | public class RedisManager { |
springboot+日志slf4j
1 | spring-boot-starter-logging依赖了slf4j-api和log4j-api |
使用
1 | private static final Logger logger = LoggerFactory.getLogger(CommonTest.class); |
java序列化
概念:
1 | 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程(一个对象可以被表示为一个字节序列)。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 |
将对象序列化为字节序列
1 | package machine.mybootdo.common.redis.shiro; |
法1.内置ehcache缓存
pom
1 | <dependency> |
缓存配置 ehcache.xml
1 |
|
shiro配置
1 | //ehCacheManager |
再:securityManager.setCacheManager(ehCacheManager());
法2.自定义redis缓存
RedisCache
1 | package machine.mybootdo.common.redis.shiro; |
RedisCacheManager
1 | package machine.mybootdo.common.redis.shiro; |
shiro配置
1 | ("${spring.redis.host}") |
Constant
1 | public class Constant { |
yml
1 | #配置缓存和session存储方式,默认ehcache,可选redis |
4. shiro+授权
1 | 前提就是在Realm的授权方法中查询出权限并返回List<String>形式 |
userRealm
1 |
|
基于角色的访问权限控制
根据用户id列出该用户拥有的权限(菜单)列表
MenuMapper.xml
1 | <select id="listUserPerms" resultType="string"> |
MenuDao.java
1 | List<String> listUserPerms(Long id); |
MenuServiceImpl
1 |
|
StringUtils
1 | <dependency> |
方法1:使用xml配置方法(不采用)
applicationContext-shiro.xml配置
方法2:使用注解方法
开启aop支持(否则shiro注解无法生效)
1 | <dependency> |
shiro注解支持
1 | /** |
使用shiro注解
1 | ("sys:user:user") |
执行流程
1 | 当调用controller的一个方法,由于该 方法加了@RequiresPermissions("item:query") ,shiro调用realm获取数据库中的权限信息,看"item:query"是否在权限数据中存在,如果不存在就拒绝访问,如果存在就授权通过。 |
测试
1 | ok-授权缓存 |
建立一个异常处理器处理非法授权异常403
common.exception.BDExceptionHandler
1 |
|
common.utils.HttpServletUtils
1 | public class HttpServletUtils { |



