shiro的动态权限,一般都是将权限放在数据库中,项目启动后将权限加载给shiro
当数据库的权限数据发生改变时,重新加载权限给shiro。
单机这样做没问题,但是当项目服务是集群的时候,比如有tomcat1,tomcat2,tomcat3,那么更新权限后,重新加载权限的操作只能落到一个tomcat上,比如落到tomcat1上了,那么tomcat1的权限是最新的,但tomcat2,tomcat3的权限却还是旧的。
争对这种问题,本文提供几种解决方案供参考:
1.穷举法(最low解)
当有权限资源更新时,多调几次重新加载权限的方法,尽量保证每个tomcat都能被调到。
这种方法最快,但也最扯,集群太多的时候,难免有遗漏,权限是个很关键的业务,不建议用这种不靠谱的穷举方式
2.第三方redis(最优解)
把shiro权限资源的保存改到redis上,每次从数据库加载权限到redis上,由于redis是唯一的,所以这样做肯定没问题。但要使用redis。
一般集群下shiro的session管理也是交给redis,一样的道理。
3.mq消费订阅(最快开发)
使用mq使用mq的发布订阅模式,每个tomcat启动时就订阅一个特定主题,当数据库的权限资源发生修改时,发布者发布一条这个主题的mq,那么每个tomcat订阅者就都会接到这个命令,接下来就各自加载更新各自的权限就行了。