Spring整合Shiro 權限 角色 用戶關系分析
作者 : Stanley 羅昊
【轉載請注明出處和署名,謝謝!】
前置內容
之前我們學習了,使用注解的方式去完成權限的控制,當然,也是靜態的,也就是說我們之前並沒有與數據庫交互;
所以,接下來就是,如果我們要依靠數據庫來實現授權,說白了就是需要去數據庫查找該用戶是否擁有這項權限;
所以,這里我們可以想一下,既然已經用到數據庫了,我們就可以聯想到在數據庫中,是不是有一個字段來專門保存權限呀;
這個時候,我們就需要想一個問題了,我們該如何去設計或創建這張表呢?
在這里,我們的用戶、角色、權限,他們之間都是怎么關系呢?
所以,在數據庫中,我們就依賴這三者關系所建立出來的;
所以,這個時候我們需要縷清,用戶、角色以及授權這三者究竟是什么關系;
用戶、角色及授權三者關系
Shiro的授權模式采用Rbac模式,意思就是,誰,扮演了什么角色,被允許執行什么操作,其中的“誰”就是user,其中扮演什么角色(role),操作就是權限(permission);
接下來,我們來看一幅圖,並作出詳細解釋:
可操作的事情、所處角色、具體實施的人;
我們來看,他們之間的關系對應的是什么?
首先我們來看可操作的事情:
我們在這個欄中可以看到,我們分別有 主持班會 授課 課間輔導 ...;而它對應上的中間的這一欄,也就是所處職位。
分別有授課老師,班主任以及校長;再往后呢,會對應上我們具體實施的人,dafei(大飛)laow(老王)stef(斯特芬);
我們先來看左邊兩個,比如中間欄中的授課老師,它分別對應上了授課、課間輔導、課程設計;對應我們的班主任呢,它就可以主持班會主持研討會;
大家注意看,這個是不是就是僅僅職位所能干的事情呀,也就是說這某一個職位所具有的職能被允許做某些事情;
這個時候,左面這兩個欄中,跟用戶(右一)這一欄中,有任何關系嗎?
答案是沒有關系,那么在什么時候有關系呢?比如這個時候,dafei出來了,如果它被任命為授課老師的話,拿換一句話說,這個dafei是不是就已經擁有授課課間輔導以及課程設計的權力了呀;
角色有許多種,所以,不同的角色可以執行不同的操作;
而具體實施的人,就是我們的用戶,用戶扮演某種角色,如果這個用戶扮演了校長這個角色,那么它就被授予校長所擁有的操作,正如上面欄目中的授課及主持研討會;
三者之間存在的關系
所處的職位與可操作的事情之間有什么關系嗎?
首先看授課,授課老師是不是可以做三件事情,授課、課間輔導、設計課程,那么反過來,是不是可執行操作能對應上許多職位呀,比如授課可以給校長,也可以給班主任;所以他們之間的關系是多對多對多關系;
一個權限,可以分配給多個角色,一個角色可以擁有多個權限,也是一樣的說法;
角色跟用戶又是什么關系呢?
我們先來站在stef的角度來看,他是不是即可以擔任校長又可以授課,也就是他擁有兩個角色;
反過來說呢,角色也可以給多個用戶進行扮演,所以他們之間也是多對多的關系;
用戶跟權限有關系嗎?
是沒有關系的!他們之間是沒有直接的關聯,如果非要扯上關系的話,那么就需要通過中間的這個角色;
比如,這個dafei對應上我們的授課老師,所以大飛就擁有了授課、課程輔導、課程設計這三種權限;
所以,角色是他們倆之間的關聯,使他們擁有了關系;
數據庫表的設計
我們需要把他們分成三張表進行設計:
權限表 角色表 用戶表,這三張表;
但是,你們這三張表相互獨立,是無法體現出多於多的關系;
那我們該怎么辦呢?
如果想產生多與多多對多的關系,那么就必須借助中間表;
所以需要五張表:
permission權限表 role角色表,role_permission權限角色關聯表:
這個是他們倆的中間關聯表;說白了就是role是角色表,他所對應的權限,比如role表中的id1是校長這個時候permission表中id1 與 id3是校長所擁有的操作,主持研討會與授課,所在中間表里體現的就是:
role_id permission_id
1 1
1 3
接下來呢,就是用戶與角色的對應;用戶與角色也是多對多的關系;
所以就存在一個用戶與角色之間的關聯表:
你這個用戶,扮演了什么角色,角色也可以被多個用戶扮演;比如:userid1 name是小明 userid2是小剛;roleid1所屬角色是校長;id2是教師;
user_id role_id
1(小明) 1(扮演校長)
2(小剛) 2(扮演教師)
如果用戶是扮演了兩個角色呢?很簡單;假設 userid15 是大飛 他擁有 校長與授課老師的角色 校長角色 roleid對應5 教師對應 3
user_id role_id
15(大飛) 5(扮演校長)
15(大飛) 3(扮演教師)
數據庫字段設計
用戶表:
用戶表就比較簡單【講解模式下】:
不需要在該表中關聯任何權限之類的,因為在另外兩張表中已經規划好;
角色表:
角色表也非常簡單,第一個是id,第二個就是name角色名稱的意思,第三個就是對應的英文標識,用英文詮釋name中的中文,僅此而已;
換成上面圖片中的內容,就是授課老師 班主任 校長...這些可扮演的角色;
權限表(可操作的事情):
權限表就非常重要了!
權限就是表示我們可操作的事情;前面的id就是權限id中間的name就是權限的名稱,比如主持班會 授課 課程設計,而后面這個呢,就是權限表達式,也是最關鍵的一個,就是由它來控制權限的;
在Shiro中,權限表達式是按照三段式來寫的,第一段前面是資源中間一個雙點( :)然后再雙點后面跟上資源實例;
所以,在字段中,resource就是資源表達式,我們需要把一段權限表達式寫在該字段內;
就如上面寫的一樣,把選中的部分放入到字段中;
role與permission中間表(角色與權限中間表):
這個我在上方也詳細說過;
role_id:
這個字段存的是role表中的id,就是角色表id,這個角色可以擁有那些權限(permission_id);
permission_id
這個字段是權限表,也就是可以操作的事情,代表這個角色可以擁有那些權限,並產生多對多的關系;
一個角色(role_id)可以被授予多個權限(permission_id);反過來,一個權限可以被多個角色使用;
用戶表(user):
用戶表就無需添加任何字段,因為,另外四張表都使用了用戶表的ID,所以產生了被動牽連;
用戶(user)與角色(role)關系表
user_id就是用戶表中用戶的id,role_id就是角色表中的角色id;
意思就是,這個用戶可以扮演某些角色,一個用戶可以扮演多個角色;
一個角色也可以被多個用戶同時扮演;