模型
基礎(chǔ)模型共有三個概念:
- 用戶
- 角色
- 菜單
用戶與角色是一對多的關(guān)系,角色與菜單是一對多的關(guān)系。
角色
角色是中間過渡層,某個登錄的用戶,通過用戶唯一標(biāo)識(判斷用戶承擔(dān)哪些角色),判斷具有哪些權(quán)限,進(jìn)而確定其能執(zhí)行哪些操作(訪問哪些資源)
菜單
在administrator項目中,菜單共分為三類,如下:
- 目錄(無頁面指向,無權(quán)限依附)
- 菜單(有頁面指向,無權(quán)限依附)
- 按鈕(無頁面指向,有權(quán)限依附)
按鈕
按可見性分,按鈕分為兩類,一類是看的見的按鈕,一類是看不見的按鈕。
- 看的見的按鈕,稱之為功能性按鈕,每一個功能性按鈕都應(yīng)該在權(quán)限系統(tǒng)中注冊;
- 看不見的按鈕在頁面中不體現(xiàn),但用于被權(quán)限依附。(特指【查看】按鈕)。
模型實現(xiàn)
模型在項目中通過5張關(guān)系表來實現(xiàn):
- 用戶表sys_user(主鍵、用戶名、密碼(密)、鹽)
- 角色表sys_role(主鍵、名稱、備注)
- 用戶角色關(guān)系表sys_user_role(主鍵、用戶主鍵、角色主鍵)
- 菜單表sys_menu(主鍵、父鍵、名稱、指向、權(quán)限、類型、圖片、排序)
- 角色菜單關(guān)系表sys_role_menu(主鍵、角色主鍵、菜單主鍵)
職責(zé)分配
Shiro的職責(zé)是,對每一個操作請求(及資源訪問請求),驗證請求者是否具備對應(yīng)的權(quán)限?!皺?quán)限”這個概念在項目中的具體落地則是指唯一的字符串。由于項目龐大,權(quán)限較多,因此需要采用冒號分隔法來體現(xiàn)權(quán)限的層級結(jié)構(gòu)。
為了排除一些不需要驗證的的操作請求(及資源訪問請求),Shiro提供了過濾器支持。具體如何配置及使用可參見官網(wǎng)。
對于Shiro的session管理、緩存管理等其他方面的知識,時常參考官網(wǎng)及imooc網(wǎng)站進(jìn)行學(xué)習(xí)。
開發(fā)者的職責(zé)是:
- 負(fù)責(zé)向Shiro提供其需要的Realm。Realm存儲了合法用戶有哪些,權(quán)限定義了多少個,及用戶與權(quán)限的對應(yīng)關(guān)系(需通過角色層過渡)。
- 在定義一個接口時,需要定義對應(yīng)的權(quán)限,這個權(quán)限最終要依附于“按鈕”進(jìn)行分配。這個按鈕可以在界面上體現(xiàn)(可點擊),也可以不在界面上體現(xiàn)(只用于管理員分配)
原則上講,可點擊按鈕對應(yīng)的接口權(quán)限必須依附于對應(yīng)的按鈕,而其他跨表接口的權(quán)限則可以統(tǒng)一寫入頁面對應(yīng)的【查看】按鈕不可見按鈕中。(減少一個權(quán)限對應(yīng)一個按鈕的實際操作的復(fù)雜度)
總結(jié)
下面總結(jié)一下在實際開發(fā)過程中,對于權(quán)限分配的可操作步驟:
后端開發(fā)程序員(寫接口時),在文檔中應(yīng)說明調(diào)用該接口應(yīng)具備的權(quán)限(字符串)
前端開發(fā)程序員(寫頁面和js的),在界面中調(diào)用的每一個接口,都應(yīng)判斷該接口的調(diào)用是否需要權(quán)限。如果需要權(quán)限,則應(yīng)通過后臺管理系統(tǒng)將權(quán)限分配給對應(yīng)的按鈕上。(實體按鈕)(虛擬按鈕)
后記
當(dāng)用戶登錄成功之后,頁面會緩存該用戶的所具備的權(quán)限列表(由服務(wù)器返回),頁面根據(jù)權(quán)限的有無來確定菜單(包括目錄、菜單、按鈕)的顯示與否。
Realm中存儲的權(quán)限用于比對,即使前端頁面通過非法手段在緩存的權(quán)限列表中增加了部分假權(quán)限,進(jìn)而看到了被隱藏的按鈕,但到服務(wù)端的時候依然驗證不過。