.NET 通用高扩展性的细粒度权限管理架构(webApi/Mvc)
http://www.cnblogs.com/jonneydong/p/6336889.html
一. 权限场景分析:
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, 往后会深入讲解)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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='权限汇总表';
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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