位运算权限管理通过为每个权限分配唯一2的幂值(如READ=1、WRITE=2),用整数二进制位存储组合权限;授予权限用|,校验用&==常量,撤销用&~,支持O(1)极速鉴权。

在权限系统中,用位运算管理多权限是一种高效、轻量且广泛使用的方案。核心思路是:每个权限对应一个唯一的二进制位(如 1, 2, 4, 8…),多个权限组合即为这些位的按位或(|)结果;校验是否拥有某权限,则用按位与(&)判断该位是否被置 1。
权限常量定义:用 2 的幂作为唯一标识
每个权限应是一个独立的、互不重叠的整数,推荐用 public static final int 或枚举 + int 值定义:
PUBLIC_READ = 1 << 0; // 1PUBLIC_WRITE = 1 << 1; // 2USER_EDIT = 1 << 2; // 4ADMIN_DELETE = 1 << 3; // 8SYSTEM_CONFIG = 1 << 4; // 16
这样保证任意两个权限值做 & 运算结果恒为 0,避免误判。
赋予多个权限:用按位或(|)合并
用户或角色可同时拥有多个权限,只需将对应常量用 | 连接:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
int userPerms = PUBLIC_READ | USER_EDIT | ADMIN_DELETE; // 1 | 4 | 8 = 13- 数据库中可存为单个
INT字段(如 MySQL 的INT UNSIGNED,支持最多 32 种权限) - 若权限数超 32,可用
long(64 位)或拆分为多个字段/使用位图(BitSet)
校验单个权限:用按位与(&)判断
检查用户是否具备某项权限,只需判断对应位是否为 1:
if ((userPerms & USER_EDIT) == USER_EDIT) { /* 允许编辑 */ }- 注意不能只写
(userPerms & USER_EDIT),因为非零不等于“有权限”(比如USER_EDIT=4,而userPerms=6(即 2|4)时,6&4==4成立;但若误写成6&4 != 0在逻辑上也对,但显式比对更清晰、可读性更好) - Java 8+ 可封装为工具方法:
static boolean hasPermission(int userBits, int perm) { return (userBits & perm) == perm; }
扩展操作:移除权限、切换权限、全量校验
位运算还支持动态修改权限:
-
移除权限:用异或(
^)配合与非(~),更安全的是userPerms & ~PERM_TO_REMOVE(例如perms & ~PUBLIC_WRITE) -
添加权限(无副作用):直接
userPerms |= NEW_PERM -
切换权限(有则删、无则加):
userPerms ^= TOGGLE_PERM -
是否拥有全部指定权限:如需同时具备 A、B、C,可写
(userPerms & (A | B | C)) == (A | B | C)
这种设计天然支持权限的原子性组合与快速判定,没有集合遍历开销,也不依赖 ORM 映射复杂关系,在高并发鉴权场景(如网关拦截、API 权限检查)中性能优势明显。

















