1、
书写打印语句,运行查看打印的次数,从而获取到代码执行的次数:
@Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { //获取用户的用户名,跟doGetAuthenticationInfo方法中的new SimpleAuthenticationInfo参数是对应的 String username= (String) principalCollection.iterator().next(); //根据用户名查询当前用户的前台列表 Set<String> roleNames=roleDao.queryRoleNameByUsername(username); Set<String> ps=permissionDao.queryPermissionsByUsername(username); SimpleAuthorizationInfo info=new SimpleAuthorizationInfo(); info.setRoles(roleNames); info.setStringPermissions(ps); System.out.println("查询用户及权限信息"); return info; }
从打印结果来看,代码执行了多次,使用Shiro进行权限管理过程中,每次授权都会访问realm中的doGetAuthorizationInfo方法查询当前用户的角色及权限信息,如果系统的用户量比较大则会对教据库造威比较大的压力(会对所有的权限进行一次比较)
2020-09-29 15:22:04.150 INFO 11984 --- [ main] com.zhb.test.DemoApplication : Started DemoApplication in 6.44 seconds (JVM running for 7.9) 2020-09-29 15:22:09.717 INFO 11984 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2020-09-29 15:22:09.717 INFO 11984 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2020-09-29 15:22:09.732 INFO 11984 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 15 ms Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@718a383c] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: select * from tb_users where username=? ==> Parameters: zhai(String) <== Columns: user_id, username, password, password_salt <== Row: 1, zhai, ae1de49a9f24d38da38f7afe9ce70db4, 68795 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@718a383c] 成功 zhai123 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@143272b] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT role_name FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: role_name <== Row: 学生 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@143272b] Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@394df695] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT tb_permissions.permission_code FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id INNER JOIN tb_rps ON tb_roles.role_id = tb_rps.rid INNER JOIN tb_permissions ON tb_rps.pid = tb_permissions.permission_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: permission_code <== Row: stu_select <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@394df695] 查询用户及权限信息 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@26d7596d] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT role_name FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: role_name <== Row: 学生 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@26d7596d] Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@103bb341] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT tb_permissions.permission_code FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id INNER JOIN tb_rps ON tb_roles.role_id = tb_rps.rid INNER JOIN tb_permissions ON tb_rps.pid = tb_permissions.permission_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: permission_code <== Row: stu_select <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@103bb341] 查询用户及权限信息 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7436aff4] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT role_name FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: role_name <== Row: 学生 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7436aff4] Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@79afc66a] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT tb_permissions.permission_code FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id INNER JOIN tb_rps ON tb_roles.role_id = tb_rps.rid INNER JOIN tb_permissions ON tb_rps.pid = tb_permissions.permission_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: permission_code <== Row: stu_select <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@79afc66a] 查询用户及权限信息 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6430afc2] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT role_name FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: role_name <== Row: 学生 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6430afc2] Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@49d3c55e] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT tb_permissions.permission_code FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id INNER JOIN tb_rps ON tb_roles.role_id = tb_rps.rid INNER JOIN tb_permissions ON tb_rps.pid = tb_permissions.permission_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: permission_code <== Row: stu_select <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@49d3c55e] 查询用户及权限信息 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1db031b7] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT role_name FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: role_name <== Row: 学生 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1db031b7] Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5c691bd4] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT tb_permissions.permission_code FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id INNER JOIN tb_rps ON tb_roles.role_id = tb_rps.rid INNER JOIN tb_permissions ON tb_rps.pid = tb_permissions.permission_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: permission_code <== Row: stu_select <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5c691bd4] 查询用户及权限信息 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@669b4a4a] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT role_name FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: role_name <== Row: 学生 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@669b4a4a] Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@477cdf24] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT tb_permissions.permission_code FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id INNER JOIN tb_rps ON tb_roles.role_id = tb_rps.rid INNER JOIN tb_permissions ON tb_rps.pid = tb_permissions.permission_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: permission_code <== Row: stu_select <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@477cdf24] 查询用户及权限信息 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5617431d] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT role_name FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: role_name <== Row: 学生 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5617431d] Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@247ce7cd] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT tb_permissions.permission_code FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id INNER JOIN tb_rps ON tb_roles.role_id = tb_rps.rid INNER JOIN tb_permissions ON tb_rps.pid = tb_permissions.permission_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: permission_code <== Row: stu_select <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@247ce7cd] 查询用户及权限信息 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4a94583f] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT role_name FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: role_name <== Row: 学生 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4a94583f] Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6775981e] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6b0efb9] will not be managed by Spring ==> Preparing: SELECT tb_permissions.permission_code FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id INNER JOIN tb_rps ON tb_roles.role_id = tb_rps.rid INNER JOIN tb_permissions ON tb_rps.pid = tb_permissions.permission_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: permission_code <== Row: stu_select <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6775981e] 查询用户及权限信息
2、缓存的使用
Shiro支持缓存以降低对数据库的访问压力〔缓存的是授权信息)
(1)导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>mybatis-spring-boot-cache</artifactId> </dependency> <!--第三方缓存的支持--> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency> <!--shiro对缓存的支持--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.4.0</version> </dependency>
(2)配置缓存策略
<?xml version="1.0" encoding="UTF-8"?> <ehcache updateCheck="false" dynamicConfig="false"> <diskStore path="C: oolsehcache" /> <defaultCache name="defaultCache" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false" maxElementsOnDisk="100000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> </defaultCache> </ehcache>
- diskStore:缓存数据持久化的目录
- eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
- maxElementsInMemory:缓存中允许创建的最大对象数
- overflowToDisk:内存不足时,是否启用磁盘缓存。
- timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前, 两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是 0 就意味着元素可以停顿无穷长的时间。
- timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
- memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。
- diskPersistent:设定在虚拟机重启时是否进行磁盘存储,默认为false
- diskExpiryThreadIntervalSeconds: 属性可以设置该线程执行的间隔时间(默认是120秒,不能太小
FIFO,先进先出
LFU,最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
LRU,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
(3)配置缓存管理器
配置缓存管理器:
@Bean public EhCacheManager getEhCacheManager(){ EhCacheManager ehCacheManager=new EhCacheManager(); ehCacheManager.setCacheManagerConfigFile("classpath:ehcache.xml"); return ehCacheManager; }
将缓存管理器交给SecurityManager:
@Bean//安全管理器 public DefaultWebSecurityManager getDefaultWebSecurityManager(MyRealm myRealm,EhCacheManager ehCacheManager) { DefaultWebSecurityManager defaultSecurityManager = new DefaultWebSecurityManager(); defaultSecurityManager.setRealm(myRealm);//SecurityManager完成校验需要realm defaultSecurityManager.setCacheManager(ehCacheManager); return defaultSecurityManager; }
(4)测试
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@37f849de] 成功 zhai123 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5e7d8fd8] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@2b0be8da] will not be managed by Spring ==> Preparing: SELECT role_name FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: role_name <== Row: 学生 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5e7d8fd8] Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@8ed5890] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@2b0be8da] will not be managed by Spring ==> Preparing: SELECT tb_permissions.permission_code FROM tb_users INNER JOIN tb_urs ON tb_users.user_id = tb_urs.uid INNER JOIN tb_roles ON tb_urs.rid = tb_roles.role_id INNER JOIN tb_rps ON tb_roles.role_id = tb_rps.rid INNER JOIN tb_permissions ON tb_rps.pid = tb_permissions.permission_id WHERE tb_users.username=? ==> Parameters: zhai(String) <== Columns: permission_code <== Row: stu_select <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@8ed5890] 查询用户及权限信息