Spring與Shiro整合 權限 角色 用戶關系分析


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;

意思就是,這個用戶可以扮演某些角色,一個用戶可以扮演多個角色;

一個角色也可以被多個用戶同時扮演;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM