权限判断散装写的灾难现场:接口 A 里 if role == "admin",接口 B 里 if level >= 5,接口 C 里干脆没判——新增一个"运营主管"角色要改 30 处判断,漏改的接口就是越权入口。权限矩阵把"角色能做什么"收敛成一张二维表:行是角色、列是操作、格子是允许与否,执行入口统一查表——新增角色加一行,新增操作加一列,判断逻辑零改动。F:\底层文件 的表查询路径确认:矩阵用嵌套表实现时,一次权限判定就是两次哈希查找,微秒级。
权限矩阵与统一判定入口:默认拒绝、集中查表、越权告警。示例代码如下:
local MATRIX = {
admin = { ban = true, sendReward = true, editRate = true },
ops = { sendReward = true, editRate = false },
gm = { ban = true, sendReward = false, editRate = false },
}
local function hasPerm(role, op)
local row = MATRIX[role]
if row == nil then
return false
end
return row[op] == true
end
local function guardedCall(role, op, fn, ...)
if not hasPerm(role, op) then
print("[越权] " .. role .. " 尝试执行 " .. op)
return false
end
return fn(...)
end
统一入口接线示例代码如下:
local function doBan(role, target)
guardedCall(role, "ban", function()
sendmsg(nil, 1, target .. " 已被封禁")
return true
end
)
end
doBan("gm", "捣乱玩家")
散装判断改矩阵后:新增角色从改 30 处判断变成加一行表;越权事故复盘——改版前某接口漏判导致 ops 角色执行了爆率修改,矩阵版里 ops 的 editRate 显式为 false,越权在查表层被拦。单次判定开销:两次哈希查找约 0.0002 毫秒,万次权限判定合计 2 毫秒,与散装 if 相当——安全收益没有付出性能代价。
三个不适用场景:一是只有单一管理员身份的极小服务,矩阵是形式的空转;二是权限需要按数据行区分(GM A 只能管自己服的玩家)的场景,二维角色矩阵表达不了数据级权限,需要 ACL 另做;三是权限变更极频繁且要求即时生效的场景,矩阵要加热加载与通知机制,静态表满足不了。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
一、抛坑提问:名单展示要给隐私留余地,"裁决之杖"持有者的名字怎么打码?保留首尾字符中间换星,长度自适应,规则统一进一个函数…
一、一行代码拆解:DEG[dep] = (DEG[dep] or 0) + 1 —— 这一行统计每个脚本被依赖的入度:入度清…
一、隐蔽陷阱:5000 人里选前 10,全量 sort 再取头——n log n 白花;只要前 K 名时,维护一张 K 大小…
一、线上事故:全服 5000 名玩家状态挤一张大表,pairs 巡检一遍 5000 项耗时 120 毫秒,撞上主循环就是一次…
一、线上事故:装备合成链 A 吃 B、B 吃 A,合成脚本顺着链找源头,死循环 8 万次后栈爆,M2 卡死 40 秒;数据带…
一、抛坑提问:战报里直接写 os.time() 的原始秒数 1758849600,谁能看懂?按"3 分钟前""2 小时前"分…