Spring+shiro,让shiro管理所有权限,特别是实现jsp页面中的权限点标签,每次打开页面需要读取数据库看权限,这样的方式对数据库压力太大,使用缓存就能极大减少数据库访问量。
下面记录下shiro配置JSP权限标签+角色标签+缓存的过程:
1首先在配置文件xml中配置securityManager。
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!--认证管理器--> <property name="realm" ref="permissionsRealm" /> <!-- 缓存管理器 --> <property name="cacheManager" ref="shiroCacheManager" /> </bean> <!--认证管理器实现类--> <bean id="permissionsRealm" class="com.soft.security.Realm.PermissionsRealm" /> <!--缓存管理器实现类,这里用的是系统自带的--> <bean id="shiroCacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager" />
2然后,在PermissionsRealm类中,重写doGetAuthorizationInfo方法,在方法中需要做两件事:(1)设置角色(2)设置权限点。代码如下:
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.addRole("角色名"); info.addStringPermission("权限点名");
3.此时,在JSP页面中就可以调用标签验证权限与角色了。
在页面顶部引用<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> 标签库,
然后在想触发权限点的地方写入:
<shiro:hasPermission name="1111"> 用户拥有权限 </shiro:hasPermission>
如果用户有1111权限,则会显示“用户拥有权限”,同样,如果测试用户是否拥有某个角色,可以用以下标签:
<shiro:hasRole name="管理员"> 用户拥有角色 </shiro:hasRole>
4.由于在1中,配置文件里面已经配置了缓存管理器,因此每次页面打开,后台只会读取一次用户角色+权限,后续都会用缓存,重新登陆后缓存自动清空。