按位运算实现的权限管理

需求

  • 销售系统中需要由销售总监分配权限给销售经理,然后经理再将自己拥有的权限分配到下属人员

实现

  • 假设现在有4项权限,分别是add、remove、update、delete,将权限用二进制数字保存起来,修改权限时,只需要修改相应位置的数值即可

销售总监将权限分配给经理

  • 比如,销售经理的默认权限是‘0000’,如果需要将add权限分配给经理,只需要将第0位的数字该为1即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
permission_tuple = ('add', 'remove', 'update', 'delete')
manager_permission = 0

# 将销售经理的权限转换成list
bin_manager_permission = int(manager_permission, 2)[2:]
diff = len(permission_tuple) - len(bin_manager_permission)
if diff != 0:
manager_permission_string = '0' * diff + bin_manager_permission

manager_permission_list = list(manager_permission_string)

# 修改相应权限所在的index的数值
index = permission_tuple.index('add')
manager_permission_list[index] = '1'

# 最后再转换成数字
modifed_permission = int(''.join(manager_permission_list), 2)
  • 这里最好不要使用二进制XOR操作来做权限的翻转,分布式场景下,如果两个操作同时要将权限由0修改为1,那么两次XOR操作的情况下权限修改将会失败

经理将权限分配给下属

  • 与总监分配给经理操作方式相同,但需要首先确认经理本身的权限情况,本身没有的权限不能分配给下属

  • 下属查询自己的权限时,除了要查询自身被分配到的权限外,还需要查询到经理的权限,然后做合并后才是自己实际用于的权限,这样可以防止经理将权限分配下去后,总监又将这项权限从经理手中收回造成的错误

1
2
3
permission = 15     # '1111'
manager_permission = 7 # '0111'
permission *= manager_permission # '0111'