一. 許可權場景分析: 1. 系統具有角色概念, 部門概念, 且都具有相應不同的許可權 2. 用戶具有多個角色, 多個部門等關係, 並且能給單個用戶指派獨有的許可權 3. 具有細粒度許可權控制到資源的RBAC, 能控制頁面, 控制菜單, 控制邏輯, 控制單個操作, 控制到單一數據; 且具有一定的可擴展性 4 ...
一. 許可權場景分析:
1. 系統具有角色概念, 部門概念, 且都具有相應不同的許可權
2. 用戶具有多個角色, 多個部門等關係, 並且能給單個用戶指派獨有的許可權
3. 具有細粒度許可權控制到資源的RBAC, 能控制頁面, 控制菜單, 控制邏輯, 控制單個操作, 控制到單一數據; 且具有一定的可擴展性
4. 適用於webapi/ mvc / wcf / webservice 混合項目中
5. 設置許可權和驗證許可權易用性高
二. 資料庫表設計
1. 角色表
2. 部門表
3. 用戶表
4. 菜單表
5. 用戶表
6. 許可權表
7. 用戶角色關係表
8. 用戶部門關係表
9. 菜單許可權關係表
10.用戶許可權關係表
11.部門許可權關係表
12. 許可權彙總表
在一般正常的情況下, 大家伙都會有 菜單許可權關係, 用戶許可權關係, 部門許可權關係等表, 在此處省去如上幾項許可權關係表, 將如上許可權表做成dll 當插件形式容入到項目中.
許可權彙總表描述:
既然將如上所有跟許可權有關聯的關係表剔除後該如何來設計各種來自不同體系的許可權呢? 因此在此許可權彙總表中要有欄位來定位到, 該條許可權是屬於什麼體系.
因此許可權彙總表中出現三個至關重要的欄位:
1. PermissionType(許可權的類型: 菜單,部門,角色,用戶 );
2. PermissionReferenceId(許可權類型的引用ID: 當Type為角色時 為角色的ID 以此類推);
3. PermissionAction(許可權操作的ID: 每個許可權將會劃分為一個操作編號ID, 往後會深入講解)
1 -- 許可權彙總表
2 CREATE TABLE `Permission` (
3 `Id` int(11) NOT NULL AUTO_INCREMENT,
4 `PermissionReferenceId` int(11) DEFAULT NULL COMMENT '許可權引用ID(對應 角色ID, 用戶ID, 部門ID)',
5 `PermissionAction` int(11) DEFAULT NULL COMMENT '許可權操作ID(每種資源的操作ID)',
6 `PermissionType` int(11) DEFAULT NULL COMMENT '許可權類型()',
7 `CreateTime` datetime DEFAULT '1990-01-01 00:00:00' COMMENT '創建時間',
8 `UpdateTime` datetime DEFAULT '1990-01-01 00:00:00' COMMENT '修改時間',
9 `IsEnable` bit(1) DEFAULT b'1' COMMENT '是否可用',
10 PRIMARY KEY (`Id`)
11 ) ENGINE=InnoDB AUTO_INCREMENT=390 DEFAULT CHARSET=utf8 COMMENT='許可權彙總表';
許可權彙總表SQL代碼
1 -- 部門表
2 CREATE TABLE `AdminMent` (
3 `Id` int(11) NOT NULL AUTO_INCREMENT,
4 `DepartName` varchar(20) DEFAULT NULL COMMENT '部門名',
5 `Description` varchar(20) DEFAULT NULL COMMENT '部門說明',
6 `Icon` varchar(20) DEFAULT NULL COMMENT '圖標',
7 `CreateTime` datetime DEFAULT NULL COMMENT '創建時間',
8 `UpdateTime` datetime DEFAULT NULL COMMENT '修改時間',
9 `IsEnable` bit(1) DEFAULT b'1' COMMENT '是否可用',
10 PRIMARY KEY (`Id`)
11 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='部門表';
12
13
14 -- 部門用戶關係表
15 CREATE TABLE `AdminMentAdminUsers` (
16 `AdminMent_Id` int(11) NOT NULL,
17 `AdminUser_Id` int(11) NOT NULL,
18 PRIMARY KEY (`AdminMent_Id`,`AdminUser_Id`),
19 KEY `AdminMent_UserCollection_Target` (`AdminUser_Id`)
20 ) ENGINE=MyISAM DEFAULT CHARSET=gbk;
21
22
23 -- 角色表
24 CREATE TABLE `AdminRole` (
25 `Id` int(11) NOT NULL AUTO_INCREMENT,
26 `RoleName` varchar(20) DEFAULT NULL COMMENT '角色名',
27 `Description` varchar(20) DEFAULT NULL COMMENT '角色說明',
28 `CreateTime` datetime DEFAULT NULL COMMENT '創建時間',
29 `UpdateTime` datetime DEFAULT NULL COMMENT '修改時間',
30 `IsEnable` bit(1) DEFAULT b'1' COMMENT '是否可用',
31 PRIMARY KEY (`Id`)
32 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='後臺角色表';
33
34
35 -- 角色用戶關係表
36 CREATE TABLE `AdminRoleAdminUsers` (
37 `AdminRole_Id` int(11) NOT NULL,
38 `AdminUser_Id` int(11) NOT NULL,
39 PRIMARY KEY (`AdminRole_Id`,`AdminUser_Id`),
40 KEY `AdminRole_UserCollection_Target` (`AdminUser_Id`)
41 ) ENGINE=MyISAM DEFAULT CHARSET=gbk;
42
43
44 -- 用戶表
45 CREATE TABLE `AdminUser` (
46 `Id` int(11) NOT NULL AUTO_INCREMENT,
47 `UserName` varchar(20) DEFAULT NULL COMMENT '後臺用戶名',
48 `Password` varchar(50) DEFAULT NULL COMMENT '後臺用戶密碼',
49 `Mail` varchar(50) DEFAULT NULL COMMENT '用戶郵箱',
50 `Phone` varchar(20) DEFAULT NULL COMMENT '用戶手機',
51 `Description` varchar(20) DEFAULT NULL COMMENT '附加說明',
52 `CreateTime` datetime DEFAULT NULL COMMENT '創建時間',
53 `UpdateTime` datetime DEFAULT NULL COMMENT '修改時間',
54 `IsEnable` bit(1) DEFAULT b'1' COMMENT '是否可用',
55 PRIMARY KEY (`Id`)
56 ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='後臺用戶表';
57
58 -- 菜單表
59 CREATE TABLE `AdminMenu` (
60 `Id` int(11) NOT NULL AUTO_INCREMENT,
61 `ParentsID` int(11) DEFAULT NULL COMMENT '父菜單ID',
62 `MenuName` varchar(20) DEFAULT NULL COMMENT '菜單名稱',
63 `Descriptotion` varchar(20) DEFAULT NULL COMMENT '菜單說明',
64 `ControllerPermissionName` varchar(20) DEFAULT NULL COMMENT '控制器名',
65 `ActionPermissionName` varchar(20) DEFAULT NULL COMMENT '操作器名',
66 `Sort` int(11) DEFAULT NULL COMMENT '排序',
67 `Icon` varchar(20) DEFAULT NULL COMMENT '圖標',
68 `CreateTime` datetime DEFAULT NULL COMMENT '創建時間',
69 `UpdateTime` datetime DEFAULT NULL COMMENT '修改時間',
70 `IsEnable` bit(1) DEFAULT b'1' COMMENT '是否可用',
71 PRIMARY KEY (`Id`)
72 ) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 COMMENT='後臺管理菜單表';
其它數據表SQL代碼
三. 許可權無處不在
若要讓設置許可權和驗證許可權易用性高, 最好的解決方案則是利用 Attribute 來進行許可權的設置.
如圖:
1 /// <summary> 2 /// 附加許可權 3 /// </summary> 4 [AttributeUsage(validOn: AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 5 public class PermissionAttribute : Attribute 6 { 7 /// <summary> 8 /// 許可權類型 9 /// </summary> 10 public PermissionKinds Kind { get; set; } = PermissionKinds.AllowAnonymous; 11 /// <summary> 12 /// 操作許可權 13 /// </summary> 14 public PermissionActions Action { get; set; } = PermissionActions.AllowAnonymous; 15 }PermissionAttribute
將PermissionKinds 劃分為 菜單 和 數據
1 /// <summary> 2 /// 用於標識api介面和mvc訪問許可權驗證類型 3 /// </summary> 4 public enum PermissionKinds : int 5 { 6 /// <summary> 7 /// 匿名 8 /// </summary> 9 AllowAnonymous = 0, 10 /// <summary> 11 /// 菜單 12 /// </summary> 13 MENU = 1, 14 /// <summary> 15 /// 資源操作 16 /// </summary> 17 DATASOURCE = 2 18 }PermissionKinds
PermissionActions 則是 標識操作資源的許可權編號
例: 用戶表: User_Read = 10, User_Edit=11, User_Add=12, User_Delete=13 (當然此處也可以進行擴展如: 搜索用戶 User_Search=14)
1 /// <summary> 2 /// 用於標識操作資源的許可權動作類型 3 /// </summary> 4 [JsonConverter(typeof(int))] 5 public enum PermissionActions : int 6 { 7 /// <summary> 8 /// 匿名 9 /// </summary> 10 AllowAnonymous = 0, 11 12 13 #region 表:ActionPermission(控制器操作許可權表) 許可權 14 /// <summary> 15 /// 控制器操作許可權表讀取許可權 16 /// </summary> 17 [PermissionActionDescription("控制器操作許可權表", "讀取")] 18 ActionPermission_Read = 10, 19 /// <summary> 20 /// 控制器操作許可權表修改許可權 21 /// </summary> 22 [PermissionActionDescription("控制器操作許可權表", "修改")] 23 ActionPermission_Edit = 11, 24 /// <summary> 25 /// 控制器操作許可權表添加許可權 26 /// </summary> 27 [PermissionActionDescription("控制器操作許可權表", "添加")] 28 ActionPermission_Add = 12, 29 /// <summary> 30 /// 控制器操作許可權表刪除許可權 31 /// </summary> 32 [PermissionActionDescription("控制器操作許可權表", "刪除")] 33 ActionPermission_Delete = 13, 34 #endregion 35 36 #region 表:AdminMent(部門表) 許可權 37 /// <summary> 38 /// 部門表讀取許可權 39 /// </summary> 40 [PermissionActionDescription("部門表", "讀取")] 41 AdminMent_Read = 20, 42 /// <summary> 43 /// 部門表修改許可權 44 /// </summary> 45 [PermissionActionDescription("部門表", "修改")] 46 AdminMent_Edit = 21, 47 /// <summary> 48 /// 部門表添加許可權 49 /// </summary> 50 [PermissionActionDescription("部門表", "添加")] 51 AdminMent_Add = 22, 52 /// <summary> 53 /// 部門表刪除許可權 54 /// </summary> 55 [PermissionActionDescription("部門表", "刪除")] 56 AdminMent_Delete = 23, 57 #endregion 58 59 #region 表:AdminMenu(後臺管理菜單表) 許可權 60 /// <summary> 61 /// 後臺管理菜單表讀取許可權 62 /// </summary> 63 [PermissionActionDescription("後臺管理菜單表", "讀取")] 64 AdminMenu_Read = 30, 65 /// <summary> 66 /// 後臺管理菜單表修改許可權 67 /// </summary> 68 [PermissionActionDescription("後臺管理菜單表", "修改")] 69 AdminMenu_Edit = 31, 70 /// <summary> 71 /// 後臺管理菜單表添加許可權 72 /// </summary> 73 [PermissionActionDescription("後臺管理菜單表", "添加")] 74 AdminMenu_Add = 32, 75 /// <summary> 76 /// 後臺管理菜單表刪除許可權 77 /// </summary> 78 [PermissionActionDescription("後臺管理菜單表", "刪除")] 79 AdminMenu_Delete = 33, 80 #endregion 81 82 #region 表:AdminRole(後臺角色表) 許可權 83 /// <summary> 84 /// 後臺角色表讀取許可權 85 /// </summary> 86 [PermissionActionDescription("後臺角色表", "讀取")] 87 AdminRole_Read = 40, 88 /// <summary> 89 /// 後臺角色表修改許可權 90 /// </summary> 91 [PermissionActionDescription("後臺角色表", "修改")] 92 AdminRole_Edit = 41, 93 /// <summary> 94 /// 後臺角色表添加許可權 95 /// </summary> 96 [PermissionActionDescription("後臺角色表", "添加")] 97 AdminRole_Add = 42, 98 /// <summary> 99 /// 後臺角色表刪除許可權 100 /// </summary> 101 [PermissionActionDescription("後臺角色表", "刪除")] 102 AdminRole_Delete = 43, 103 #endregion 104 105 #region 表:AdminUser(後臺用戶表) 許可權 106 /// <summary> 107 /// 後臺用戶表讀取許可權 108 /// </summary> 109 [PermissionActionDescription("後臺用戶表", "讀取")] 110 AdminUser_Read = 50, 111 /// <summary> 112 /// 後臺用戶表修改許可權 113 /// </summary> 114 [PermissionActionDescription("後臺用戶表", "修改")] 115 AdminUser_Edit = 51, 116 /// <summary> 117 /// 後臺用戶表添加許可權 118 /// </summary> 119 [PermissionActionDescription("後臺用戶表", "添加")] 120 AdminUser_Add = 52, 121 /// <summary> 122 /// 後臺用戶表刪除許可權 123 /// </summary> 124 [PermissionActionDescription("後臺用戶表", "刪除")] 125 AdminUser_Delete = 53, 126 #endregion 127 128 #region 表:AdminUserRoles(後臺用戶角色表) 許可權 129 /// <summary> 130 /// 後臺用戶角色表讀取許可權 131 /// </summary> 132 [PermissionActionDescription("後臺用戶角色表", "讀取")] 133 AdminUserRoles_Read = 60, 134 /// <summary> 135 /// 後臺用戶角色表修改許可權 136 /// </summary> 137 [PermissionActionDescription("後臺用戶角色表", "修改")] 138 AdminUserRoles_Edit = 61, 139 /// <summary> 140 /// 後臺用戶角色表添加許可權 141 /// </summary> 142 [PermissionActionDescription("後臺用戶角色表", "添加")] 143 AdminUserRoles_Add = 62, 144 /// <summary> 145 /// 後臺用戶角色表刪除許可權 146 /// </summary> 147 [PermissionActionDescription("後臺用戶角色表", "刪除")] 148 AdminUserRoles_Delete = 63, 149 #endregion 150 }PermissionActions
至此,我們只需要要將要 進行許可權審核驗證的方法上進行 permissionattribute 標記即可
附上相應的codesmith 代碼生成
1 <%@ CodeTemplate Language="C#" TargetLanguage="