加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

一种简单的直观的高效的权限设计

发布时间:2020-12-12 15:20:33 所属栏目:MsSql教程 来源:网络整理
导读:??? 大部分系统都有权限系统。一般来说,它能管控人员对某个否页面的访问;对某些字段、控件可见或者不可见。对gridview中的数据是否可删除、可添加、可新增等等。大部分人都把权限作为一个子系统独立出来。但是这里我不是想设计一个权限管理系统,网上的设

??? 大部分系统都有权限系统。一般来说,它能管控人员对某个否页面的访问;对某些字段、控件可见或者不可见。对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://zhuqil.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读