我们看一下下面这个问题, 在MyRealm中增加输出语句:
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {String username = (String) principals.iterator().next(); // 得到已经登录成功的用户名, 实际上获取到的内容是 doGetAuthenticationInfo 方法中 new SimpleAuthenticationInfo(用户名, 用户密码, 当前Realm名称) 中的第一个参数Set<String> roles = roleMapper.queryRoleByUserName(username); // 通过用户名得到角色名称Set<String> permissions = permissionMapper.queryPermissionByUserName(username); // 通过用户名得到权限信息System.out.println("我在授权...."); // 增加该语句SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();info.setRoles(roles); // 将数据库查询出来的信息封装到 AuthorizationInfo 中info.setStringPermissions(permissions);return info;
}
那么我们登录随意一个用户进行测试:
登录lisi:我在授权.... (显示12次)
其原因则是我们/resource/templates/index.html中使用了<shiro:hasPermission>
进行判断, 每使用一次<shiro:hasPermission>
就会调用一次MyRealm::doGetAuthorizationInfo方法.
下面在pom.xml
文件中进行引入缓存:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId>
</dependency>
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-cache</artifactId><version>1.4.1</version>
</dependency>
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-ehcache</artifactId><version>1.4.1</version>
</dependency>
当然了, 准备了ehcache就需要定义/resources/ehcache.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache><diskStore path="java.io.tmpdir/Tmp_EhCache"/><defaultCache eternal="false" maxElementsInMemory="10000" overflowToDisk="false" diskPersistent="false"timeToIdleSeconds="1800" timeToLiveSeconds="259200" memoryStoreEvictionPolicy="LRU"/>
</ehcache>
随后我们在ShiroAutoConfiguration中进行配置:
// ... 其他代码
@Bean
public EhCacheManager ehCacheCacheManager() {EhCacheManager ehCacheManager = new EhCacheManager();ehCacheManager.setCacheManagerConfigFile("classpath:ehcache.xml");return ehCacheManager;
}@Bean
public SecurityManager securityManager(MyRealm myRealm, EhCacheManager ehCacheManager) { // 增加一个 EhCacheManager 参数DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(myRealm);securityManager.setCacheManager(ehCacheManager); // 配置到 Realm 中去return securityManager;
}
修改完毕后, 我们再次授权就不会每次都访问数据库了.