一:缓存的流程
1:缓存的作用:用于缓存认证信息和授权信息,不用每次都去数据库里查询数据,而是从缓存中获取。
2:shiro的本质工作是认证和授权,缓存的工作shiro没有做,而是预留了接口cache,cache中有对要缓存数据的操作方法,让开发者去做不同的实现。
3:我们可以对cache接口进行redis,memcache或者ehcache的实现。
4:CacheManager接口也是shiro预留的接口,供开发者去做不同实现,在CacheManager的实现类中返回上步中对cache的实现。
5:可以给shiro的SecurityManager设置CacheManager,也可以给Realm设置CacheManager,最终都是给Realm设置CacheManager。因为最终是Realm在使用缓存,用来缓存认证信息和授权信息。
6:缓存流程为:shiro通过CacheManager的实现类获取到Cache的实现类对象,然后调用Cache中的相应的方法对要缓存的数据进行操作。
可以参考这篇文章对以上介绍有帮助:https://blog.csdn.net/amoscxy/article/details/82785235
二:缓存的数据
shiro默认开始授权缓存,而关闭认证缓存。
下面分别介绍缓存两种信息的意义:
(一)缓存授权信息
1:当第一次访问授权时,会调用自定义Realm的获取授权数据的方法,从数据库中查询授权数据,并将其以登录者的Principal为键,存储在缓存中。以后的每次访问授权,就直接从缓存中获取,而不再从数据库中获取。
2:清空缓存的时机:
(1)当退出登录时,会调用清空缓存的方法,将以当前登陆者的Principal为键的缓存中的授权数据清空掉。
(2)如果修改了用户的权限,而用户不退出系统,修改的权限不会生效,此时需要手动调用realm的clearCache方法清除缓存,待下次访问授权数据时,重新从数据库中获取,并存储在缓存中。
(3)用户未退出登录的情况下,关闭浏览器,也清空缓存????(用户未退出登录,关闭浏览器,如果没有RememberMe的话,下次再访问系统,会有一个全新的session接待它,重新开始认证、授权,并将授权信息缓存起来,那么上次没有清空的缓存,什么时候自动失效呢?好像没有设置缓存失效的时间?)
(4)Session到期了,也清空缓存???
(二)缓存认证信息
1:在调用subject.login()方法时,判断是否打开了认证缓存,如果打开了认证缓存,则从缓存中获取认证信息,如果获取不到,则从realm中获取认证信息,并将其放入缓存中。缓存认证信息有什么用?不是就认证一次吗?有人说:这是给当前线程未处理完的业务做得缓存,后续业务会用到啊,但是是哪些后续业务呢?
2:清空认证信息缓存的时机
(1)当退出登录时,会调用清空认证信息缓存的方法。
疑问:
分布式的情况下,共用一个redis缓存,如果一个实例改变了权限,其他实例怎么知道?共用redis的情况下,是不是不用通知其他实例了?