spring集成shiro框架的时候,如果要校验接口的权限,可以使用@RequiresPermissions之类的注解。如果某个接口(方法)的权限有多个,比如@RequiresPermissions(value={"aaa","bbb"...n}),这样的话,会导致调用n次doGetAuthorizationInfo方法,而我们会在doGetAuthorizationInfo方法内获取当前用户所拥有的权限,那问题就来了,理论上只需要获取一次用户的所有权限就行了的,但是现在却获取了n次。shiro的原理如下:
如果接口有这个@RequiresPermissions注解,这个注解的处理逻辑是放在PermissionAnnotationHandler类中的assertAuthorized方法,源码如下:
注解@RequiresPermissions中的每个perm都会调用一次isPermitted方法,每个isPermitted方法都会调用一次doGetAuthorizationInfo方法。
有大神有遇到shiro的这个权限校验问题么?
拿默认的and连接来说,,默认配置下最终通过ModularRealmAuthorizer.checkPermissions循环去判断权限

前提:自己写的realm实现了AuthorizingRealm
首先,即使是循环,也并不是真的每次都一定会执行doGetAuthorizationInfo方法,AuthorizingRealm.getAuthorizationInfn增加了cachaManager的支持,要是你配置了cacheManger,那就只会查一次;
这是一种解决方案,使用chacheManager,缺点也是有的,你要是还是在使用session的话,这玩意对于修改权限以后,如果不移除旧的权限信息,不重新登陆估计会翻车。
第二种的话,就是doGetAuthorizationInfo里面也可以采用类似于cachemanager的处理,同一个身份信息的时候,直接获取,而不是再去查询库
第三个你也可以覆盖原始实现,改写循环调用的这部分逻辑,但是感觉意义不大,就为了这个,而要去做这些东西,你还得知道底层都做了些什么