大部分系統都有權限系統。通常來講,它能管控人員對某個否頁面的訪問;對某些字段、控件可見或者不可見。對gridview中的數據是否可刪除、可添加、可新增等等。大部分人都把權限做爲一個子系統獨立出來。可是這裏我不是想設計一個權限管理系統,網上的設計方案太多了,能夠說每一個開發人員都有本身的開發權限管理系統的想法和思路。sql
在這篇文章中,我先用簡單的C#代碼模仿一個用戶的權限,再使用sql去模擬。這是一種很簡單,很直觀,很高效的方式去斷定用戶的權限。數據庫
C#:數據庫設計
好吧,先從最簡單開始,定義一個用戶(User)類,以下。sqlserver
1 class User
2 {
3 bool CanDelete;
4 bool CanRead;
5 bool CanWrite;
6 bool CanModify;
7 bool CanCreate;
8 }this
這裏設計5個屬性來管控用戶的權限。我發現這樣雖然很直觀,可是不宜擴張。咱們將權限獨立出來,在看下面代碼:編碼
1 enum PermissionTypes : int
2 {
3 None = 0,
4 Read = 1,
5 Write = 2,
6 Modify = 4,
7 Delete = 8,
8 Create = 16,
9 All = Read | Write | Modify | Delete | Create
10 }
11 class User
12 {
13 public PermissionTypes Permissions = PermissionTypes.None;
14 }設計
咱們先試用一下,你就能感受到神奇之處:orm
1 //建立一個用戶
2 User admin = new User();
3 admin.Permissions = PermissionTypes.Read
4 | PermissionTypes.Write
5 | PermissionTypes.Delete;
6
7 //驗證權限
8 bool canRead = ((PermissionTypes.Read & admin.Permissions) == PermissionTypes.Read);
9 bool canWrite = ((PermissionTypes.Write & admin.Permissions) == PermissionTypes.Write);
10 bool canCreate = ((PermissionTypes.Create & admin.Permissions) == PermissionTypes.Create);
11
12 //查看結果
13 Console.WriteLine(canRead); //true
14 Console.WriteLine(canWrite); //true
15 Console.WriteLine(canCreate); //false
16 server
利用了'|'和'&'兩個操做。可是這樣看起來非常很別捏,初始化權限和驗證權限用了一長串'|'和'&'運算的代碼。很不直觀。我在System.Enum中擴展一些方法供你調用,代碼以下。blog
1 //是否存在權限
2 public static bool Has<T>(this System.Enum type, T value)
3 {
4 try
5 {
6 return (((int)(object)type & (int)(object)value) == (int)(object)value);
7 }
8 catch
9 {
10 return false;
11 }
12 }
13 //判斷權限
14 public static bool Is<T>(this System.Enum type, T value)
15 {
16 try
17 {
18 return (int)(object)type == (int)(object)value;
19 }
20 catch
21 {
22 return false;
23 }
24 }
25 //添加權限
26 public static T Add<T>(this System.Enum type, T value)
27 {
28 try
29 {
30 return (T)(object)(((int)(object)type | (int)(object)value));
31 }
32 catch (Exception ex)
33 {
34 throw new ArgumentException(
35 string.Format(
36 "不能添加類型 '{0}'",
37 typeof(T).Name
38 ), ex);
39 }
40 }
41
42 //移除權限
43 public static T Remove<T>(this System.Enum type, T value)
44 {
45 try
46 {
47 return (T)(object)(((int)(object)type & ~(int)(object)value));
48 }
49 catch (Exception ex)
50 {
51 throw new ArgumentException(
52 string.Format(
53 "不能移除類型 '{0}'",
54 typeof(T).Name
55 ), ex);
56 }
57 }
使用一下:
1 //建立一個用戶
2 User admin = new User();
3 PermissionTypes permissions = new PermissionTypes();
4 admin.Permissions = permissions;
5 //添加權限
6 admin.Permissions = admin.Permissions.Add(PermissionTypes.Create);
7 admin.Permissions = admin.Permissions.Add(PermissionTypes.Read);
8 admin.Permissions = admin.Permissions.Add(PermissionTypes.Write);
9 //判斷權限
10 bool canRead = admin.Permissions.Has(PermissionTypes.Read); //true
11 bool canWrite = admin.Permissions.Has(PermissionTypes.Write); //true
12 bool canDelete = admin.Permissions.Has(PermissionTypes.Delete); //false
13 bool canCreate = admin.Permissions.Has(PermissionTypes.Create); //true
14
15 Console.WriteLine(canRead); //true
16 Console.WriteLine(canWrite); //true
17 Console.WriteLine(canDelete); //false
18 Console.WriteLine(canCreate); //true
19 Console.Read();
SQL:
大部分權限管理都是數據庫的操做,好依照上面的思路,我在sqlserver裏面模擬一下以上的操做,在sql中與或運算是很高效的。先設計兩張表User和Permission。
一、獲取有Read權限的全部用戶:
1 select * from [User] where PermissionTypes&1 =1
Result:
二、獲取有Delete權限的全部用戶:
1 select * from [User] where PermissionTypes&8 =8
Result:
三、判斷麒麟是否有有Delete權限
1 if exists (select * from [User] where Name='qilin' and PermissionTypes&8 =8)
2 print 'true'
3 else
4 print 'flase'
Result: flase
【項目內容描述】
ASP.NET 權限管理系統設計具體需求
一、 應包括如下模塊:功能模塊管理、角色管理、用戶管理、角色受權、用戶受權
功能模塊管理:管理系統中可用模塊的地址、功能在HTML頁面的顯示功能名和樹狀結構(即上下級關係)等,已經增長的項目不可實際刪除,可採用刪除標記方式來記錄已經被刪除的功能
角色管理:爲方便用戶受權而使用的一組權限集合體,可選擇一個或多個用戶(如多個一次同時受權不能實現,也可單個獨立受權)進入角色權限管理模塊
用戶管理:管理參與系統操做的用戶信息,每一個用戶都必須是和其管理業務相關的部門下員工,提供用戶管理到用戶受權的關係連接
角色受權:系統中存在的角色進行受權操做,一個角色可受權多個功能模塊,一個功能模塊也可受權給多個角色,系統提供角色選擇的查詢界面,可選擇一個或多個用戶(如多個一次同時受權不能實現,也可單個獨立受權)同時進行可操做功能模塊的受權管理,每一個功能模塊上又有多個操做按鈕,也須要進行權限控制
用戶受權:對系統中存在的用戶進行受權操做,一個用戶可授多個角色權限,也可授多個直接的功能模塊權限,每一個功能模塊上又有多個操做按鈕,也須要進行權限控制
(注:用一個字段記錄此按鈕權限,對每種權限使用一位數據的方式來判斷是否具備此功能,如:審覈——第1位、新增——第2位、修改——第3位、刪除——第4位,則1011表示,此用戶或角色具備:查詢、修改、刪除權限,但不具備新增權限)
按鈕功能採用規定按鈕ID和名稱的形式進行控制(按鈕名稱爲:新增:btn_Add,修改:btn_Edit,刪除btn_Delete)
用戶權限可以控制到數據級,即:上級部門的用戶可以觀看下級用戶的數據,而下級用戶不能觀看上級用戶生成的數據。注:此數據由數據的組織機構編碼來判斷。
用戶進行權限管理時,除ADMIN用戶能增長頂級用戶外,其餘用戶只有增長比本用戶權限更低級的用戶,系統只有一個ADMIN用戶,且不可維護。ADMIN用戶不屬於任何一個部門(即此用戶不能參與業務操做)
二、 用戶登陸後,系統根據用戶登陸權限,自動將其可以操做的功能樹展示,但只展示其可以使用的功能權限樹,
三、 菜單樹分爲2層:分佈在上方的爲一級菜單樹,分佈在左方的爲二級如下菜單樹(含二級)且可以與一級菜單樹產生JS連動效果
四、 可以控制界面上按鈕(查詢、新增、修改、刪除)等多種操做單獨設置
五、 可以根據數據庫中的模塊結構生成相應的功能模塊樹(型結構)
六、 受權時,應考慮菜單的父子關係,如:授予子節點A1權限時,其父節點A的訪問權限必須得到受權
七、受權界面顯示最好可以將功能模塊的父子關係顯示出來
八、 符合數據庫設計要求:
用戶信息表可自主建立,但必須包括後面用戶信息表(POPEDOM_USER)中定義的幾個字段
其中:
EMP_ID來自員工基本信息表EMP_ID
LOGIN_ID是指用戶用來登陸系統使用的ID
LOGIN_PASSWORD
表中建立人ID和建立時間爲此數據第一次建立時的操做員及時間(建立人填寫的爲EMP_ID而不是登陸ID)
表中修改人ID和修改時間爲本次修改時的操做員及時間,若爲第一次,此項輸入與建立人ID和建立時間相同,
其餘的表只是參考實現,能夠進行表名及模塊名的變動,另:用戶與功能模塊對應表未建立,可參照用戶與角色表進行建立。
九、 數據庫參考實現:
用戶信息表 POPEDOM_USER
英文字段名 中文字段名 數據類型及長度 是否可爲空 備註
EMP_ID 員工信息表ID CHAR(24) PK
LOGIN_ID 登陸ID VARCHAR(50) 是
LOGIN_PASSWORD 登陸賬戶密碼 VARCHAR(50) 是
系統模塊基本表 POPEDOM_MODULE
英文字段名 中文字段名 數據類型及長度 是否可爲空 備註
MODULE_ID 系統模塊基本表ID CHAR(24) PK
MODULE_NAME 模塊名稱 VARCHAR(50)
MODULE_PATH 模塊路徑 VARCHAR(50)
SUPMODULE_ID 上級模塊ID CHAR(24) FK
DESCR 描述 VARCHAR(200) 是
CREATE_EMPID 建立人ID CHAR(24) FK
CREATE_DATE 建立時間 DATETIME
UPDATE_EMPID 修改人ID CHAR(24) FK
UPDATE_DATE 修改時間 DATETIME
DEPT_CODE 組織機構編號 Varchar(32) FK
ISDEL 刪除標示 CHAR(1) 0否1是
角色基本表 POPEDOM_ROLE
英文字段名 中文字段名 數據類型及長度 是否可爲空 備註
ROLE_ID 角色基本表ID CHAR(24) PK
ROLE_NAME 角色名稱 VARCHAR(50)
DESCR 描述 VARCHAR(200) 是
CREATE_EMPID 建立人ID CHAR(24) FK
CREATE_DATE 建立時間 DATETIME
UPDATE_EMPID 修改人ID CHAR(24) FK
UPDATE_DATE 修改時間 DATETIME
DEPT_CODE 組織機構編號 Varchar(32) FK
ISDEL 刪除標示 CHAR(1) 0否1是
角色控制模塊的權限表 POPEDOM_ROLECORR_MODULE
英文字段名 中文字段名 數據類型及長度 是否可爲空 備註
ROLECORR_MODULE_ID 角色控制模塊的權限表ID CHAR(24) PK
ROLE_ID 角色基本表ID CHAR(24) PK
MODULE_ID 系統模塊基本表ID CHAR(24) PK
RIGHT_SIGN 權限標示 CHAR(8) 權限標示(1審覈2添加3修改4刪除) 0000
DESCR 描述 VARCHAR(200) 是
CREATE_EMPID 建立人ID CHAR(24) FK
CREATE_DATE 建立時間 DATETIME
UPDATE_EMPID 修改人ID CHAR(24) FK
UPDATE_DATE 修改時間 DATETIME
DEPT_CODE 組織機構編號 Varchar(32) FK
ISDEL 刪除標示 CHAR(1) 0否1是
用戶與角色對應表 POPEDOM_EMPCORR_ROLE
英文字段名 中文字段名 數據類型及長度 是否可爲空 備註
EMPCORR_ROLE_ID 用戶與角色對應表ID CHAR(24) PK
EMP_ID 用戶ID CHAR(24) FK
ROLE_ID 角色基本表ID CHAR(24) FK
DESCR 描述 VARCHAR(200) 是
CREATE_EMPID 建立人ID CHAR(24) FK
CREATE_DATE 建立時間 DATETIME
UPDATE_EMPID 修改人ID CHAR(24) FK
UPDATE_DATE 修改時間 DATETIME
DEPT_CODE 組織機構編號 Varchar(32) FK
ISDEL 刪除標示 CHAR(1) 0否1是
【接包方必備的條件】
精通C#與ASP.NET
有豐富的權限管理系統設計經驗
有現成可用的相似權限管理模塊最好