二進制實現權限的分配管理

大部分系統都有權限系統。通常來講,它能管控人員對某個否頁面的訪問;對某些字段、控件可見或者不可見。對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

有豐富的權限管理系統設計經驗

有現成可用的相似權限管理模塊最好

相關文章
相關標籤/搜索