1. 程式人生 > >後臺管理許可權設計

後臺管理許可權設計

前言

最近一直在重寫後臺系統,對使用的介面與技術進行一次更新。涉及到許可權這塊,最初考慮引入Shiro,但由於對這個框架理解不太深,並且專案DeadLine在那放著,所以決定自己搞一套,畢竟自己搞的比較熟悉方便維護,也方便二次開發定製。

需求明確

以下是整理的現階段需求,以後有二期需求再加上

一、使用者未登入時,會提示未登入並轉到登入介面

二、使用者賬戶被鎖定時,會提示被鎖定並轉到登入介面

三、使用者在沒有許可權時,點選後臺按鈕會提示無許可權

四、選單要根據給使用者分配的角色填充,只出現該角色可展示的選單

五、不攔截靜態資源,如:css、js、html等

六、區分是否是Ajax請求,是的話返回對應json資料

七、使用者只能檢視自己的產品

資料庫設計

需求明確就可以設計資料庫了,這個根據專案、業務來。

使用者表

產品表

角色表

選單表

許可權表

使用者與產品關聯表

使用者與角色關聯表

角色與選單關聯表

角色與許可權關聯表

以下是對應結構圖:
圖片:Baidu_icon

首先看選單設計

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構成。

許可權攔截流程設計

Baidu_icon