博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转一个权限设计
阅读量:6109 次
发布时间:2019-06-21

本文共 3686 字,大约阅读时间需要 12 分钟。

大部分系统都有权限系统。一般来说,它能管控人员对某个否页面的访问;对某些字段、控件可见或者不可见。对gridview中的数据是否可删除、可添加、可新增等等。大部分人都把权限作为一个子系统独立出来。但是这里我不是想设计一个权限管理系统,网上的设计方案太多了,可以说每个开发人员都有自己的开发权限管理系统的想法和思路。

   在这篇文章中,我先用简单的C#代码模仿一个用户的权限,再使用sql去模拟。这是一种很简单,很直观,很高效的方式去判定用户的权限。

C#:

   好吧,先从最简单开始,定义一个用户(User)类,如下。

1 
class
 User 
2 
{
3 
    
bool
 CanDelete;
4 
    
bool
 CanRead;
5 
    
bool
 CanWrite;
6 
    
bool
 CanModify;
7 
    
bool
 CanCreate;
8 
}
复制代码

    这里设计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 
    }
复制代码

    我们先试用一下,你就能感觉到神奇之处:

 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 
        }
复制代码

 

使用一下:

 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。

 

1、获取有Read权限的所有用户:

1 
select
 
*
 
from
 
[
User
]
 
where
 PermissionTypes
&
1
 
=
1
 

Result:

2、获取有Delete权限的所有用户:

1 
select
 
*
 
from
 
[
User
]
 
where
 PermissionTypes
&
8
 
=
8

Result:

3、判断麒麟是否有有Delete权限

1 
if
  
exists
 (
select
 
*
 
from
 
[
User
]
 
where
 Name
=
'
qilin
'
 
and
  PermissionTypes
&
8
 
=
8
)
2    
print
 
'
true
'
3 
else
4    
print
 
'
flase
'
复制代码

Result: flase

转载地址:http://efhza.baihongyu.com/

你可能感兴趣的文章
raise语句
查看>>
sequence2(高精度dp)
查看>>
如何向 Linux 内核上游提交 Patch ?
查看>>
Go编程笔记(7)
查看>>
Go语言int类型绑定方法
查看>>
pid控制的文章
查看>>
MySQL中EXPLAIN命令详解
查看>>
redis 单点部署
查看>>
Java中需要编码的场景
查看>>
PHP生成word的三种方式
查看>>
设计模式(九)——桥接模式
查看>>
xen 创建本地存储
查看>>
TCP三次握手/四次挥手 | NAT介绍 |OSI与TCP/IP模型
查看>>
jQuery UI dialog 的使用
查看>>
ABP实战--集成Ladp/AD认证
查看>>
存储过程
查看>>
phpcms v9栏目列表调用每一篇文章内容方法
查看>>
python 自定义信号处理器
查看>>
我只是轻奢 40万内入门豪车最高让利7万!-搜狐汽车
查看>>
曲演杂坛--隐式转换
查看>>