一种简单的直观的高效的权限设计
??? 大部分系统都有权限系统。一般来说,它能管控人员对某个否页面的访问;对某些字段、控件可见或者不可见。对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 ? = 8Result: 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 ? 结束:昨天是愚人节,今天不是。欢迎大家拍砖,指正,谢谢! 作者:朱祁林 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sqlserver 分组取前n条记录
- winxp下Apache + PHP + MySql安装设置方法
- Android判断NavigationBar是否显示的方法(获取屏幕真实的高
- SQL SERVER使用REPLACE将某一列字段中的某个值替换为其他的
- 如何将表连接到其自身并在SQL中选择最大值
- SQL Server中参数化SQL写法遇到parameter sniff ,导致不合
- sql-server – 如何在SQL Azure Active Geo-Replication辅助
- sql-server – 授予sql server数据库所有者的权限是什么?
- 解决MsSQLServer导入数据时遇到【“链接服务器 '(null)
- Sql Server中的非聚集索引详细介