.NET 通用高擴展性的細粒度許可權管理架構(webApi/Mvc)

来源:http://www.cnblogs.com/jonneydong/archive/2017/01/21/6336889.html
-Advertisement-
Play Games

一. 許可權場景分析: 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="	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 說明 關於Redis:一個基於鍵值對存儲的NoSQL記憶體資料庫,可存儲複雜的數據結構,如List, Set, Hashes。 關於Spring Data Redis:簡稱SDR, 能讓Spring應用更加方便配置和訪問Redis。 本工程基於spring boot ,spring data redi ...
  • 最近在複習Servlet,發現其中有很多細節方面的東西都沒有接觸到,只是學了大概 1.請求轉發和請求重定向的區別 2.輸入參數為中文時候的亂碼問題 3.Web工程中的目錄寫法 下麵分別闡述 1.請求轉發和請求重定向的區別 請求轉發: 請求重定向: 請求轉發是伺服器行為,本質上是一次請求,所以參數可以 ...
  • 讀取HeidiSQL 配置文件中的密碼 2017 1 21 5:42:01 codegay HeidiSQL是一款開源的SQL管理工具,用管理MYSQL,MSSQL 等資料庫, 很多管理工具都會把密碼存在本地,HeidiSQL也是的,但是只是經過非常簡單的編碼,所以我經過簡單的分析後就知道瞭解密的方 ...
  • 一、Spring是什麼? 二、具體描述Spring 三、搭建Spring環境 3. Spring的配置文件:一個典型的Spring項目需要創建一個或多個Bean配置文件,這些配置文件用於在Spring IOC容器中配置Bean。Bean的配置文件可以放在classpath下,也可以放在其他目錄下。 ...
  • bean的作用域 使用bean的 scope 屬性來配置bean的作用域 scope="singleton" : 預設是單例模式 即容器初始化創建bean實例,在整個容器的生命周期內只創建這一個bean; scope="prototype" : 原型的 ,即容器初始化時不創建bean的實例,而在每次 ...
  • 對彈幕功能主要利用環信來實現的,讀者也許對環信這個東西很陌生,請先自行瞭解這環信再來看這文章。 環信開發文檔:http://docs.easemob.com/im/400webimintegration/10webimintro 請大家看文檔看WebIM這個模塊,環信官網也提供了小程式的demo,建 ...
  • FFmpeg DXVA2解碼得到的數據使用surface來承載的,surface限制很多,如果能用紋理來渲染的話,那我們就可以充分開發D3D,比如可以用坐標變換來實現電子放大的功能,還可以用坐標變換來實現視頻圖像任意角度的旋轉等功能。而對於我來說,最重要的是紋理渲染可以使得解碼後的數據能夠用像素著色... ...
  • 今天,我們來講一下建造者模式。 一、案例 我們來用winform畫一個小人,一個頭,一個身體,兩隻手,兩條腿。 我們一般想到的代碼如下: 運行的效果: 嗯,好,下麵,我們再畫一個稍微胖一點的小人。 代碼如下: 運行效果如下 咦,我們好像少花了條腿哦。 哈哈,像這樣粗心的情況我們經常出現 二、演繹 1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...