大部分系統都有權限系統。通常來講,它能管控人員對某個否頁面的訪問;對某些字段、控件可見或者不可見。對gridview中的數據是否可刪除、可添加、可新增等等。大部分人都把權限做爲一個子系統獨立出來。可是這裏我不是想設計一個權限管理系統,網上的設計方案太多了,能夠說每一個開發人員都有本身的開發權限管理系統的想法和思路。sql
在這篇文章中,我先用簡單的C#代碼模仿一個用戶的權限,再使用sql去模擬。這是一種很簡單,很直觀,很高效的方式去斷定用戶的權限。數據庫
C#:sqlserver
好吧,先從最簡單開始,定義一個用戶(User)類,以下。post
1
class
User
2
{
3
bool
CanDelete;
4
bool
CanRead;
5
bool
CanWrite;
6
bool
CanModify;
7
bool
CanCreate;
8
}
這裏設計5個屬性來管控用戶的權限。我發現這樣雖然很直觀,可是不宜擴張。咱們將權限獨立出來,在看下面代碼:this
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
}
咱們先試用一下,你就能感受到神奇之處:spa
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
利用了'|'和'&'兩個操做。可是這樣看起來非常很別捏,初始化權限和驗證權限用了一長串'|'和'&'運算的代碼。很不直觀。我在System.Enum中擴展一些方法供你調用,代碼以下。設計
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
}
使用一下:code
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:orm
大部分權限管理都是數據庫的操做,好依照上面的思路,我在sqlserver裏面模擬一下以上的操做,在sql中與或運算是很高效的。先設計兩張表User和Permission。server


一、獲取有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
結束:昨天是愚人節,今天不是。歡迎你們拍磚,指正,謝謝!