原文地址:http://www.cnblogs.com/cmsdn/p/3371576.html
快一年没写博客了,这段时间感觉好迷茫,写点博客,记录一下自己的成长过程,希望对大家也有帮助
先上图
一个用户可以有多个角色,一个用户可以属于多个部门,这些都可以控制到权限,有时特殊要求,同样的部门和角色不一定有同样的权限(虽然可以定义多个角色来实现,但是如果这种情况多了就有点麻烦了),所以还弄了个基于用户的权限,这样就可以很灵活的控制了。
每个模块的包含那些可控制的权限,用一个int类型字段控制,下边用一个枚举位标示出了系统所有的可能的权限(根据实际情况)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
using
System;
namespace
Mydream.Permission.Common
{
[Flags]
public
enum
Authority :
int
{
/// <summary>
/// 浏览权限
/// </summary>
Index = 1,
/// <summary>
/// 添加权限
/// </summary>
Add = 2,
/// <summary>
/// 编辑权限
/// </summary>
Edit = 4,
/// <summary>
/// 删除权限
/// </summary>
Delete = 8,
/// <summary>
/// 搜索权限
/// </summary>
Search = 16,
/// <summary>
/// 审核权限
/// </summary>
Verify = 32,
/// <summary>
/// 移动权限
/// </summary>
Move = 64,
/// <summary>
/// 打印权限
/// </summary>
Print = 128,
/// <summary>
/// 下载权限
/// </summary>
Download = 256,
/// <summary>
/// 备份权限
/// </summary>
Backup = 512,
/// <summary>
/// 授权权限
/// </summary>
Grant = 1024,
/// <summary>
/// 查看详细权限
/// </summary>
View = 2048,
/// <summary>
/// 导出权限
/// </summary>
Export = 4096
}
}
|
这些枚举值全部用的2的次幂,之所有这样赋值,是为了用2进制来控制权限
比如某个模块(模块A)有浏览、添加、编辑、删除、打印的权限,那么这个模块的int值=Index|Add|Edit|Delete|Print
00000001(Index=2^0=1)
00000010 (Add=2^1=2)
00000011 3
00000100(Edit=2^2=4)
00000111 7
00001000(Delete=2^3=8)
00001111 15
1000000 (Print=2^7=128)
10001111 143
最后的值其实就是1+2+4+8+128=143 所以这个模块对应的权重就是143(这个只是说明这个模块包含哪些功能)
如果一用户属于角色A,角色A包含模块A中的浏览和添加权限(1+4=5),那么这个角色A 就对应了 (角色A的ID 模块A的ID 权重=5)
我们的Action的命名按照枚举那样命名,然后每次操作的时候用这个权限INT值,然后if(INT值&Action命名的枚举==Action命名的枚举)如果为True说明有执行这个Action的权限
由于权限管理系统还在业余学习研究中,很多还没有实现,上面主要讲解了数据库的设计,后边的实现会慢慢呈现,最近都很忙,也没怎么写这个业余学习的例子了,后续有更新会慢慢放上来,写得不好请包涵,如有好的意见请赐教,谢谢!