一、通过注解实现权限拦截
1、粗粒度和细粒度的权限控制
上篇博客中,通过 URL地址进行权限控制,属于粗粒度的权限控制。
基于过滤器来实现的基本上都是粗粒度的权限控制。因为一个页面中可能有很多请求,可能 A 方法允许你调用,但是 B 方法就不允许了,但是他们都属于一个页面,那么仅靠之前的 url 来控制就不能实现。
如果是基于注解实现的权限控制,可以精确到每一个 service 方法,底层实现的是 AOP。所以细粒度的权限控制一般在 service 层实现。
权限保存在数据库中,其实从技术角度来讲,权限也就是一堆字符串,用来判断有无权限其实也就是判断有没有这堆字符串。
2、基于角色访问功能
先完成 controller 层代码和 service 层代码:
controller 层:
service 层:
相关注解好几个,看注释(需要什么功能就用什么注解即可):
这里先用角色测试:
因为底层是 AOP,所以还要配置 AOP 两个工具:
基本到这就可以了。
如果是跟着博客的代码打的话,前面有些代码需要修改一下,不然会报 500 错误:
如果没有对应的角色,会触发这个页面:
3、基于权限访问功能
前面是基于角色的,接着演示基于权限的:
那么怎么知道角色有没有这些去权限呢?还是去 MyRealm 里面去配置:
接着就是查询权限:
mapper 层:
那么到这里就完成了。
二、Shiro的Jsp标签
1、jsp标签
2、其他 jsp 标签
三、Shiro 缓存
1、配置缓存
一般来说用户不会很频繁的登录,所以一般是不需要频繁的去获取权限,但是如果某些功能需要权限,那么每次一用这个功能都会很频繁的去查数据库,这样就会造成性能下降。所以如果权限数据不会很轻易的变化情况下,如果有个缓存,就能大大缓解压力。
Shiro 提供了一个缓存工具:
先导入依赖:
然后接收新建配置文件:
里面写缓存策略:
<ehcache>
<diskStore path="java.io.tmpdir/shiro-spring-sample"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
/>
<cache name="shiro-activeSessionCache"
maxElementsInMemory="10000"
eternal="true"
overflowToDisk="true"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="600"/>
<cache name="org.apache.shiro.realm.SimpleAccountRealm.authorization"
maxElementsInMemory="100"
eternal="false"
timeToLiveSeconds="600"
overflowToDisk="false"/>
</ehcache>
接着就是在 Spring 里面配置:
最后在 myRealm 里面配置:
到此就配置完成了。