C#中二进制运算在权限验证的应用

转载 2007年09月26日 09:09:00

在我的另一篇文章中[委托在权限验证中的应用](见我的blog: http://blog.csdn.net/curllion/http://spaces.msn.com/members/curllion) 提到了一个函数ValidateAuthor,其实我以前见过这样实现的,就是一个权限用一个文本来表示,可能有“修改”、“填写”、“审核”、“删除” 等等,这样,对于每个用户,在数据库中,都有一个字段,用来记录这样的权限,某用户权限值可能是“修改|删除|审核”,这样,在查找时,就会比较用户权限 值中,有没有包括一个操作的名称。这样验证权限好办,但我弄不明白,权限的赋予与除去是如何实现的。

每一个操作的权限值,用一个二进制数来表示,每个权限值,只能是(0),(10),(100),(1000),也就是说,是2的N次方,在 MSSQL2000中,最大的整数是bigint类型的,最大可以表示64种操作。当然,这个是远远不够的。所以可以给权限分组。比如,可分为文员,主 管,经理,那么,我们最多可以分64个组,N0到N64组,第个组的权限值(rolevalue)就可以用2的N次方来表示,所以,可以表示64权限组 了。这样,不同的用户,可能属于1个或是多个权限组,一个权限组,可能包括多个用户,同理,对于一个操作,可能会属于多个权限组,一个权限组,肯定要包括 多个操作。

     先说说我的做法的主要思路:
    
     如何记录一个权限呢,比如一个用户,他有一个权限值,最大可表示为2的64次方减1,所以,这个值有64个二进制位,那么,每一位要么是0,要么是1,所 以,如果每一位表示一种权限的话,就可以表示64种权限了,因此,只要对指定的一位进行判断是0还是1,就可以验证用户的权限了。对于每一个操作的权限 值,可以用一个二进制数来表示,每个权限值,只能是(0),(10),(100),(1000),也就是说,是2的N次方,在MSSQL2000中,最大 的整数是bigint类型的,最大可以表示64种操作。当然,这个是远远不够的。所以可以给权限分组。比如,可分为文员,主管,经理,那么,我们最多可以 分64个组,N0到N64组,第N个组的权限值(rolevalue)就可以用2的N-1次方来表示,所以,可以表示64个权限组了。这样,不同的用户, 可以属于1个或是多个权限组,一个权限组,可能包括多个用户,同理,对于一个操作,可能会属于多个权限组,一个权限组,肯定要包括多个操作。因此,用户与 操作是通过权限组联系以一起的。权限组与用户,与操作之间的对应关系,都是一对多的关系。

现在说说用C#来实现,不是在SQL中实现。
在数据库中的表:
操作组:
opname     oprolevalue
填写             3            
修改             3
删除           11
提交             6
审核           12

权限组:
rolename  rolevalue
文员           1
主管           2
经理           4
总监           8

用户信息:
username userrolevalue
u1                5

在C#中:
Long userrolevalue ;//用户的权限值,根据他属于的权限组,这个值会不同
Long oprolevalue   ;//一个操作的权限值,根据他属于的权限组,这个值会不同

1、权限的赋予(或运算)
userrolevalue = userrolevalue | oprolevalue
假设一个用户u1,他的初始权限值为0(00000000)。如果要指定他有经理的权限,经理的权限值为4(00000100),在第三个二进制位为1。
很显然,userrolevalue =  0 | 4 ,值为4,如果u1要同时具有文员、主管、经理的权限呢,
userrolevalue = 0 | 1   00000000 | 00000001  = 00000001
userrolevalue = 1 | 2   00000001 | 00000010  = 00000011
userrolevalue = 3 | 4   00000011 | 00000100  = 00000111
这样,第1、2、3位都是1了,用 “或”的好处就是只改变指定位的值,如果用户已经有了该权限,再赋予一次,也不会出错,但是直接简单的用加法来做,这会出错了,如下:
userrolevalue = 7 | 4   00000111 | 00000100  = 00000111

2、权限的除去(求补、与运算)
userrolevalue = userrolevalue & (~oprolevalue)
假设一个用户u1,他的初始权限值为7(00000111),说明他能做文员、主管、经理权限组所能作的所有操作。如果不想让他有主管权限组能作的操作 呢,那么,就要把他的权限值变为00000101,而主管权限组的权限值是00000010,显然简单的用减法,肯定也是不行的,但是先对 00000010作补运算,可以得到11111101,再同00000111作与运算,就得到了00000101,这样就只对第二位作了改变,不会影响到 其它位,我们的目的也就达到了。

对于一个操作,哪些权限组能操作它,也可以用与运算来做,不让某些权限组有些操作的权限,也可以先求补,再作与运算来解决。

3、权限的验证(与运算)
(userrolevalue & oprolevalue) != 0
对于某用户,有没有某操作的权限,只要判断它们两个是不是属于同一个,或多个权限组就可以了,所以用与运算就最合适不过了。
比如u1用户,他的权限值是5(文员组、经理组00000101),对于填写操作的权限值是00000011,说明对于文员组与主管组有填写的权限。
因为 00000101 & 00000011 == 1。对于一个文员,他只属于文员组,他的权限值肯定是00000001了,对于提交操作00000110,因为00000101 &00000001 == 0,所以,他也就没有提交操作的权限了。

此的验证方法,还可以用在菜单权限的验证上来。权限值还可以是Binary数据类型的,此类型的位数可以很大,因此可以用作不分权限组的情况 

C#中二进制运算在权限验证的应用

如何记录一个权限呢,比如一个用户,他有一个权限值,最大可表示为2的64次方减1,所以,这个值有64个二进制位,那么,每一位要么是0,要么是1,所以,如果每一位表示一种权限的话,就可以表示64种权限了,...
  • u010724686
  • u010724686
  • 2013年06月04日 14:07
  • 610

C# 加密二进制与加密字符串的代码

作为商用程序,C#如同 java一样,很容易被反编译。 甚至vs 还自带了一个反编译的工具。 打开 Visual Studio, “工具”->“ILDASM”,就可以直接看到所有的变量,结构体,函...
  • cangshi004
  • cangshi004
  • 2014年05月21日 10:57
  • 616

笔记一下二进制在程序中的应用

运算符含义 运算符 含义 功能 & 按位与 如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。 l 按位或 两个相应的二进制位中只要有一个为1,该位的结果值...
  • u010499721
  • u010499721
  • 2016年03月08日 14:51
  • 376

进制间的转换,以及逻辑运算,位运算在进制间的使用

前段时间,在封装 ImageLoader 的时候,设计到 MD5转换,看到位运算符,然后今天想花点时间,把之前学的最基础的 进制以及位运算知识搬到网上然后就有了这篇博客.一、进制篇 首先,对于整数来...
  • l540675759
  • l540675759
  • 2016年04月10日 17:55
  • 562

c#+oracle实现读取图片并显示在picturebox中

废话不多说,先上结果图。     最近做某旅游系统,需要一个窗口来显示旅游景点的信息。主要内容包括名称、图片和描述。系统的数据库是位于阿里云服务器上的oracle,系统是用c#开发的winform...
  • skytruine
  • skytruine
  • 2017年05月10日 15:01
  • 715

关于位运算在权限配置及类似场景中的应用

关于位运算在权限配置及类似场景中的应用
  • cdzgzxmjh
  • cdzgzxmjh
  • 2015年08月20日 10:57
  • 164

利用Attribute标记方法的调用权限

假设我们有这么一个标记来说明操作的权限: /// /// 声明权限的标记 /// [AttributeUsage(AttributeTargets.Method)] ...
  • lee576
  • lee576
  • 2014年07月15日 10:17
  • 2326

hashcash在比特币中的应用

hashcash在比特币中的应用比特币的支付流程及原理在比特币的世界里,用户都有一个表示自己身份(或者也叫地址)的标识。这个标识是该用户的公钥信息(用base58做了一层编码)。有公钥就自然有私钥,只...
  • pony_maggie
  • pony_maggie
  • 2017年01月15日 00:16
  • 1098

mysql 中二进制日志

同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分。MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等。这些日志可以帮助我们定位mysqld内...
  • ITresource
  • ITresource
  • 2017年01月10日 15:15
  • 165

移位运算在算法中的简单应用

一、位运算应用口诀      清零取位要用与,某位置一可用或      若要取反和交换,轻轻松松用异或   二、移位运算     1、它们都是双目运算符,两个运算分量都是...
  • lcb1992
  • lcb1992
  • 2017年03月09日 17:38
  • 260
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#中二进制运算在权限验证的应用
举报原因:
原因补充:

(最多只允许输入30个字)