当我们为某个员工设置权限时,发现员工可以属于很多个部门,于是这个员工拥有的权限也将很多。
这时,我们可以考虑用与运算来出来权限的问题。
假定有很多模块,每个模块允许设置使用权限。
模块X1使用权限为权限1,
模块X2使用权限为权限4,
假定统计得出一共存在10个权限。
那么我们设定第一个权限值为1,第二个权限值为2,第三个权限值为4,等等根据二进制的原理进行设置。
如果用户A拥有权限1,权限3,那么他的权限值为5.根据以上原理,模块1的权限值为1,模块2的权限值为8。
那么我们可以使用以下查询语句来检索该用户能够使用的模块。
declare @userrole int
set @userrole = 5
select modulename from t1
where (modulerole & @userrole) > 0
原理:modulerole & @userrole使用了位运算,modulerole 和 @userrole值换算成二进制,然后相同的位置的二进制值进行与运算。如果运算结果没有一个匹配的话返回值将是零。
用户A的权限二进制值:0101
模块X1:0001
模块X2:1000
用户 模块X1 模块X2
用户A 0001 0000
通过以上原理编写权限值可以节省很多代码和处理时间。
这时,我们可以考虑用与运算来出来权限的问题。
假定有很多模块,每个模块允许设置使用权限。
模块X1使用权限为权限1,
模块X2使用权限为权限4,
假定统计得出一共存在10个权限。
那么我们设定第一个权限值为1,第二个权限值为2,第三个权限值为4,等等根据二进制的原理进行设置。
如果用户A拥有权限1,权限3,那么他的权限值为5.根据以上原理,模块1的权限值为1,模块2的权限值为8。
那么我们可以使用以下查询语句来检索该用户能够使用的模块。
declare @userrole int
set @userrole = 5
select modulename from t1
where (modulerole & @userrole) > 0
原理:modulerole & @userrole使用了位运算,modulerole 和 @userrole值换算成二进制,然后相同的位置的二进制值进行与运算。如果运算结果没有一个匹配的话返回值将是零。
用户A的权限二进制值:0101
模块X1:0001
模块X2:1000
用户 模块X1 模块X2
用户A 0001 0000
通过以上原理编写权限值可以节省很多代码和处理时间。