shiro的集群动态权限更新
shiro的動(dòng)態(tài)權(quán)限,一般都是將權(quán)限放在數(shù)據(jù)庫(kù)中,項(xiàng)目啟動(dòng)后將權(quán)限加載給shiro
當(dāng)數(shù)據(jù)庫(kù)的權(quán)限數(shù)據(jù)發(fā)生改變時(shí),重新加載權(quán)限給shiro。
單機(jī)這樣做沒(méi)問(wèn)題,但是當(dāng)項(xiàng)目服務(wù)是集群的時(shí)候,比如有tomcat1,tomcat2,tomcat3,那么更新權(quán)限后,重新加載權(quán)限的操作只能落到一個(gè)tomcat上,比如落到tomcat1上了,那么tomcat1的權(quán)限是最新的,但tomcat2,tomcat3的權(quán)限卻還是舊的。
爭(zhēng)對(duì)這種問(wèn)題,本文提供幾種解決方案供參考:
1.窮舉法(最low解)
當(dāng)有權(quán)限資源更新時(shí),多調(diào)幾次重新加載權(quán)限的方法,盡量保證每個(gè)tomcat都能被調(diào)到。
這種方法最快,但也最扯,集群太多的時(shí)候,難免有遺漏,權(quán)限是個(gè)很關(guān)鍵的業(yè)務(wù),不建議用這種不靠譜的窮舉方式
2.第三方redis(最優(yōu)解)
把shiro權(quán)限資源的保存改到redis上,每次從數(shù)據(jù)庫(kù)加載權(quán)限到redis上,由于redis是唯一的,所以這樣做肯定沒(méi)問(wèn)題。但要使用redis。
一般集群下shiro的session管理也是交給redis,一樣的道理。
3.mq消費(fèi)訂閱(最快開(kāi)發(fā))
使用mq使用mq的發(fā)布訂閱模式,每個(gè)tomcat啟動(dòng)時(shí)就訂閱一個(gè)特定主題,當(dāng)數(shù)據(jù)庫(kù)的權(quán)限資源發(fā)生修改時(shí),發(fā)布者發(fā)布一條這個(gè)主題的mq,那么每個(gè)tomcat訂閱者就都會(huì)接到這個(gè)命令,接下來(lái)就各自加載更新各自的權(quán)限就行了。
總結(jié)
以上是生活随笔為你收集整理的shiro的集群动态权限更新的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 将iOS默认上下文坐标系改变为Quart
- 下一篇: java方向好看的书