本博客所有文章分類的總目錄:http://www.cnblogs.com/asxinyu/p/4288836.html
Newlife XCode組件相關文章目錄:http://www.cnblogs.com/asxinyu/p/4329747.html
權限管理在一個系統的開發中必不可少的部分,說重要也很重要,說不重要當然也沒多少人重視。說有技術含量,但也還真有點技術含量,比如博客園吉日大哥的權限系統,我也用過,不得不佩服。當然很多人也認為沒什么技術含量,自己的系統中也都有這么個東西,也都能滿足實際需求。
我不是專門搞開發的,所以有些東西可能偏離時間的軌道。請諒解。一直對權限系統比較感興趣,也一直想打造一個屬於自己的權限管理組件,能隨心所欲的進行權限控制。我的目標是“除了普通的訪問控制權限之外,還要對每個表每條記錄的每個字段進行授權控制,另外要足夠小和簡單”不說廢話了,先看數據庫表結構設計,然后講解思路:
1.權限管理的幾個核心表是:用戶表,角色表,權限表,用戶角色表,用戶權限表,角色權限表;
2.下面是數據庫設計的初步版本,可能在必填和默認值上面還有些小錯誤,不過沒關系,主要先看思路;
User: 用戶表
| 中文名 |
英文名 |
字段名 |
數據類型 |
大小 |
主鍵 |
唯一 |
必填 |
默認值 |
| 編號 |
Id |
Id |
Int32 |
10 |
是 |
是 |
是 |
|
| 用戶名 |
UserName |
UserName |
String |
30 |
|
|
是 |
|
| 密碼 |
Password |
Password |
String |
50 |
|
|
是 |
|
| 排序碼 |
SortCode |
SortCode |
Int32 |
10 |
|
|
|
|
| 是否有效 |
IsEnable |
IsEnable |
SByte |
3 |
|
|
|
1 |
Role: 角色表
| 中文名 |
英文名 |
字段名 |
數據類型 |
大小 |
主鍵 |
唯一 |
必填 |
默認值 |
| 編號 |
Id |
Id |
Int32 |
10 |
是 |
是 |
是 |
|
| 角色名稱 |
RoleName |
RoleName |
String |
20 |
|
|
是 |
|
| 角色分類 |
Category |
Category |
String |
30 |
|
|
|
|
| 排序碼 |
SortCode |
SortCode |
Int32 |
10 |
|
|
|
9999 |
| 是否有效 |
IsEnable |
IsEnable |
SByte |
3 |
|
|
是 |
1 |
| 備注 |
Description |
Description |
String |
50 |
|
|
|
Permission: 權限表
| 中文名 |
英文名 |
字段名 |
數據類型 |
大小 |
主鍵 |
唯一 |
必填 |
默認值 |
| 編號 |
Id |
Id |
Int32 |
10 |
是 |
是 |
是 |
|
| 父編號 |
ParentId |
ParentId |
Int32 |
10 |
|
|
是 |
|
| 數據庫表名稱 |
DbTable |
DbTable |
String |
50 |
|
|
|
|
| 權限名稱 |
Name |
Name |
String |
30 |
|
|
是 |
|
| 是否開啟數據權限 |
IsDataPermission |
IsDataPermission |
SByte |
3 |
|
|
|
0 |
| 數據條件 |
Constraint |
Constraint |
String |
100 |
|
|
|
|
| 排序碼 |
SortCode |
SortCode |
Int32 |
10 |
|
|
|
9999 |
| 是否有效 |
IsEnable |
IsEnable |
SByte |
3 |
|
|
是 |
1 |
| 備注 |
Description |
Description |
String |
50 |
|
|
|
| 中文名 |
英文名 |
字段名 |
數據類型 |
大小 |
主鍵 |
唯一 |
必填 |
默認值 |
| 編號 |
Id |
Id |
Int32 |
10 |
是 |
是 |
是 |
|
| 用戶編號 |
UserId |
UserId |
Int32 |
10 |
|
|
是 |
|
| 角色編號 |
RoleId |
RoleId |
Int32 |
10 |
|
|
是 |
| 中文名 |
英文名 |
字段名 |
數據類型 |
大小 |
主鍵 |
唯一 |
必填 |
默認值 |
| 編號 |
Id |
Id |
Int32 |
10 |
是 |
是 |
是 |
|
| 權限編號 |
PermissionId |
PermissionId |
Int32 |
10 |
|
|
是 |
|
| 用戶編號 |
UserId |
UserId |
Int32 |
10 |
|
|
是 |
RolePermission: 角色權限表 (RolePermission)
| 中文名 |
英文名 |
字段名 |
數據類型 |
大小 |
主鍵 |
唯一 |
必填 |
默認值 |
| 編號 |
Id |
Id |
Int32 |
10 |
是 |
是 |
是 |
|
| 角色編號 |
RoleId |
RoleId |
Int32 |
10 |
|
|
是 |
|
| 權限編號 |
PermissionId |
PermissionId |
Int32 |
10 |
|
|
是 |
1.用戶表,角色表,用戶角色表很簡單,就不用介紹了,它們是多對多的關系。
2 用戶權限和角色權限就是權限的分配了,如果用戶及其角色具有某一個權限,則具有相應的訪問權限。
3.權限表,這個是核心,我覺得我的簡潔之處也就是在這里。着重介紹:
- 權限表是樹形的,權限的根節點是以數據庫名稱來划分,權限是以數據庫的數據表為單位的。
- 所以,權限表有一個字段名為DbTable,這個字段是的含義是“數據庫名稱+數據表名稱”,作用是這樣的:
- 絕大部分權限都是和數據庫中某個表相關的,所以這里數據表是主要的權限單位
- 每個數據庫的數據表系統默認6種數據權限:添加、刪除、修改、查詢、菜單、全局數據權限
- 也就是說每個數據表都有6個默認的子權限節點,該類型的權限節點是可以自定義的,比如新增一個
- 數據權限只能在數據表下的5種權限中添加,比如要給 刪除添加 數據權限,則在當前表的 刪除權限下添加子節點,同時打開父節點的數據權限開關。
- 當然你也可以自定義一個根節點,來自定義你的相關權限。

比如上面這張簡單的示意圖,是每個表都有的權限結構,數據權限只能在 增加,刪除,修改,查詢和全局數據權限5個地方定義,並且這5個權限,若要添加子節點,只能是數據權限。
1.全局數據權限是為了方便數據權限的定義而設置的,比如增刪查改,如果都要對某一個字段進行限制,那么只需要在全局里面定義就可以了,沒必要到每個增刪查改權限中去添加。
2. 關於自定義權限,自定義權限也可以放在任何地方,只要方便你自己就行。比如可以將自定義權限放在表下面,如果有一個表 按鈕,或者 菜單,你想添加權限控制,但又和增刪查改不完全相干,那你可以在這里自定義一個權限。
3.若定義數據權限,則將約束條件放在Constraint中,然后將數據權限授予角色或者用戶。
4.其實用戶權限表某種時候是不必要的,用戶是屬於角色的,只要定義角色權限即可,但為了某些臨時需求,臨時賦予某些用戶一些權限,所以增加了用戶權限表。
本權限系統基於Newlife.Xcode,數據權限的實現,就是在對實體進行增刪查改時進行條件過濾,目前已經完成40%的開發工作。最近搬家,7月份還要去上海培訓,所以最近一段時間是沒時間做了,今天在群里面看見有人討論數據權限,所以就趁機把自己的思路寫下來。可能比較混亂,希望大家在論壇或者群里面討論。本文對於的論壇地址為:
基於Newlife.Xcode的權限系統 歡迎討論
http://bbs.53wb.com/forum.php?mod=viewthread&tid=196&fromuid=28
Newlife.Xcode的資源:
