Skip to content

node后端项目中权限切分的思路分享

场景

在编写权限控制模块时,如果将单个权限用简单的数字代替,那么在权限组合是我们就需要去考虑多种情况,如下:

js
  const READ = 1
  const WRITE = 2
  const UPDATE = 3
  const DELETE = 4
  // 那么同时拥有读写权限的情况,我们就要定义一个新的常量
  const READ&WRITE = 5
  // ....
  // 这样效率极低,且很可能出错

解决思路

利用学习过,但不经常使用的按位或运算就可以很简单的解决这个问题

js
  const READ = 0x1   // 0001
  const WRITE = 0x10  // 0010
  const UPDATE = 0x100 // 0100
  const DELETE = 0x1000 // 1000
  // 同时拥有读写权限的情况,我们只需要进行与运算即可
  console.log((READ | WRITE).toString(2)) // 0011

简单回顾

位操作符

ECMAScript中所有数值都以 IEEE 754 64位格式存储,但是位运算符会先把值转换为32位整数,在进行位操作,之后再把结果转换为64位。

有符号整数使用前31位表示整数值,第32位表示符号(0为正,1为负)。如果一个位是空的,用0代替

按位非

按位非操作符用波浪符(~)表示,它的作用是返回数值的一补数。按位非是ECMAScript中为数不多的几个二进制数学操作符之一。

js
  let num1 = 25     // 二进制 00000000000000000000000000011001
  let num2 = ~num1  // 二进制 11111111111111111111111111100110
  console.log(num2) // -26

按位非的最终效果是对数值取反并减1

js
  // 上面的代码等价于
  let num1 = 25
  let num2 = -num1 - 1
  console.log(num) // 26

按位与

按位与操作符用和号(&)表示,有两个操作数

本质上,按位与就是将两个数的每一个位补齐,然后基于真值表中的规则,对每一位执行相应的与操作

第一个数值的位第二个数值的位结果
110
100
000
010

两个都为1才为1,遇到0必为0

看下例子:

js
  let result = 25 & 3
  // 11001(25)
  // 00011(3)
  // 00001(1)
  console.log(result) //1

按位或

按位或操作符用管道符(|)表示,同样有两个操作符。按位或遵循下列如下真值表:

第一个数值的位第二个数值的位结果
111
101
011
000

至少有一位有1时候返回1,其余时候返回0

按位异或

按位异或用脱字符(^)表示,同样有两个操作数。下面是按位异或的真值表

第一个数值的位第二个数值的位结果
110
101
011
000

它只在一位上是1的时候返回1(两位都是0或1时候,返回0)

KESHAOYE-知识星球