後臺管理許可權設計
阿新 • • 發佈:2019-01-31
前言
最近一直在重寫後臺系統,對使用的介面與技術進行一次更新。涉及到許可權這塊,最初考慮引入Shiro,但由於對這個框架理解不太深,並且專案DeadLine在那放著,所以決定自己搞一套,畢竟自己搞的比較熟悉方便維護,也方便二次開發定製。
需求明確
以下是整理的現階段需求,以後有二期需求再加上
一、使用者未登入時,會提示未登入並轉到登入介面
二、使用者賬戶被鎖定時,會提示被鎖定並轉到登入介面
三、使用者在沒有許可權時,點選後臺按鈕會提示無許可權
四、選單要根據給使用者分配的角色填充,只出現該角色可展示的選單
五、不攔截靜態資源,如:css、js、html等
六、區分是否是Ajax請求,是的話返回對應json資料
七、使用者只能檢視自己的產品
資料庫設計
需求明確就可以設計資料庫了,這個根據專案、業務來。
使用者表
產品表
角色表
選單表
許可權表
使用者與產品關聯表
使用者與角色關聯表
角色與選單關聯表
角色與許可權關聯表
以下是對應結構圖:
圖片:
首先看選單設計
CREATE TABLE `uadmin_menu` ( `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Id', `MenuName` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '選單名稱', `ParentId` int(11) NOT NULL COMMENT '父級ID', `Url` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '菜單鏈接地址', `SortOrder` int(11) NOT NULL COMMENT '排序編號', `CreateDate` datetime NOT NULL COMMENT '建立時間', PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ParenId是選單的父級ID,代表著層級關係,例如:根選單ParenId為0,Id為1,它的子選單對應的ParenId為1;Url欄位對應的是點選開啟的網址,因為可能是父級選單,所以可以為空;SortOrder是選單的排序編號,主要為了針對性地調整選單顯示的順序。
再看看許可權設計
CREATE TABLE `uadmin_power` ( `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Id', `MenuId` int(11) NOT NULL COMMENT '所屬選單ID', `PowerCode` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '許可權編碼', `PowerName` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '許可權名稱', PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
該許可權是對應選單下的方法級許可權,可以控制選單對應介面的按鈕。每次使用者點選後,有個自定義攔截器去查詢是否有該許可權;PowerCode欄位對應的是選單介面按鈕的許可權,該按鈕方法上加自定義許可權註解,傳入許可權編碼PowerCode
角色設計
CREATE TABLE `uadmin_role` (
`Id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Id' COMMENT '角色表主鍵',
`RoleName` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色名稱',
`Remark` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '備註',
`CreateDate` datetime NOT NULL COMMENT '建立時間',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
角色表比較簡單,我這裡設計的角色是預設無許可權的,得與選單表、許可權表相關聯。
商品設計
CREATE TABLE `uproduct` (
`appID` int(11) NOT NULL COMMENT '產品識別appID',
`appkey` varchar(255) DEFAULT NULL COMMENT '產品識別appKey',
`appSecret` varchar(255) DEFAULT NULL COMMENT '產品識別appSecret',
PRIMARY KEY (`appID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
商品表也比較簡單,可以根據自己的業務需求定製,這主要是做後臺使用者所屬商品關聯查詢的,對應使用者只能檢視對應商品。
使用者設計
CREATE TABLE `uadmin_user` (
`Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '使用者表主鍵',
`UserName` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '使用者名稱',
`Password` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密碼',
`DepartmentId` int(11) NOT NULL COMMENT '所屬部門編號',
`HasLock` bit(1) NOT NULL COMMENT '鎖定狀態,0為啟用,1為禁用',
`CreateDate` datetime NOT NULL COMMENT '生成時間',
`RealName` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '真實姓名',
`Mobile` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '手機號',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
這裡跟角色一樣,沒有超級使用者,都是空白許可權,需要自己對其定製。HasLock欄位表示是否鎖定,如果鎖定了,攔截器會把該使用者操作攔截下來,跳轉登入頁面。
關聯表設計
五張主表之間的關聯表,簡單來說就是用來做相互的對應關係的,由關聯表id,主表id構成。