大部分系统都有权限系统。通常来讲,它能管控人员对某个否页面的访问;对某些字段、控件可见或者不可见。对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
结束:昨天是愚人节,今天不是。欢迎你们拍砖,指正,谢谢!