位运算权限系统通过2的幂次值映射独立权限位,实现高效校验、增删与组合;如read=1、write=2,用户权限userperms=7表示read|write|delete,校验用(userperms & required) === required。

在权限校验系统中,用位运算(如 &、|、~、^)组合整数标记权限状态,本质是把每个权限映射为一个唯一的 2 的幂次值,再通过按位操作实现高效判断、叠加与剔除。这不是炫技,而是兼顾空间效率、运行速度和可读性的成熟实践。
用 2 的幂定义独立权限位
每个权限对应一个唯一二进制位,确保互不干扰:
-
READ = 1→0b0001 -
WRITE = 2→0b0010 -
DELETE = 4→0b0100 -
ADMIN = 8→0b1000
这样任意组合(如 READ | WRITE)结果是唯一整数 3(0b0011),不会与其他权限组合冲突。
用户权限用整数存储,支持快速校验
后端返回或前端缓存一个整数(如 userPerms = 7),表示该用户拥有 READ | WRITE | DELETE(1 | 2 | 4 = 7)。校验时直接用按位与:
function hasPermission(userPerms, required) {
return (userPerms & required) === required;
}
hasPermission(7, READ); // true → 7 & 1 === 1
hasPermission(7, ADMIN); // false → 7 & 8 === 0
hasPermission(7, READ | DELETE); // true → 7 & 5 === 5
动态增删权限用 | 和 & ~ 操作
不需维护数组或对象,直接修改整数即可:
- 添加权限:
userPerms |= WRITE;(等价于userPerms = userPerms | WRITE) - 移除权限:
userPerms &= ~DELETE;(~DELETE是~4 = ...11111011,与之相与即清零第 3 位) - 切换权限:
userPerms ^= ADMIN;(异或实现翻转:有则去,无则加)
权限组与角色可预定义为常量组合
避免硬编码数字,提升可维护性:
const PERMS = {
READ: 1,
WRITE: 2,
DELETE: 4,
ADMIN: 8,
// 角色组合(也是整数)
EDITOR: 1 | 2, // READ + WRITE
MANAGER: 1 | 2 | 4, // EDITOR + DELETE
SUPER: 1 | 2 | 4 | 8 // 全部
};
// 校验简洁明了
if (hasPermission(userPerms, PERMS.EDITOR)) { ... }
服务端生成权限整数时,也只需对角色查表求或运算,前后端语义一致。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











