如何为不同用户权限定义不同HTML内容?settings函数问题排查
我的settings()函数权限控制逻辑错误排查
我有一个settings()函数,在访问程序设置页面时执行。系统的用户权限等级分为1、2、3、4:
- 权限4:应显示所有内容
- 权限3:仅显示“stammdatenstyle”对应的模块
checkRights()函数用来判断当前用户权限是否高于等于请求的权限等级(根据业务逻辑推测)。现在新增权限4组后修改了代码,但出现了问题,想知道我的settings()函数哪里错了?
相关代码
JavaScript 函数代码
function settings () { if (!checkRights(2)) { showRightsInfo(); } if (checkRights(4)) { assign("STAMMDATENSTYLE", ""); assign("ADMINSTYLE", ""); } if (checkRights(3)) { assign("STAMMDATENSTYLE", ""); ("ADMINSTYLE", "display: none;"); // 此处语法错误 } else { ("STAMMDATENSTYLE", "display: none;"); // 此处语法错误 ("ADMINSTYLE", "display: none;"); // 此处语法错误 } ("PAGETITLE", "Einstellungen"); // 此处语法错误 ("MAINPAGE", "a_settings"); // 此处语法错误 ("settings"); // 此处语法错误(推测是渲染函数调用) }
HTML 模块代码
<div class="panel panel-default" style="{STAMMDATENSTYLE}"> (....) </div> <div class="panel panel-default" style="{ADMINSTYLE}"> (....) </div>
错误分析与修复方案
让我帮你拆解下这个函数里的问题,主要分为语法错误和权限逻辑逻辑错误两部分:
1. 致命语法错误:缺失函数调用前缀
代码里多处出现("参数1", "参数2");的写法,明显是漏写了assign函数名,最后一行的("settings")大概率是漏写了渲染函数(比如render("settings"))。这些语法错误会直接导致函数执行报错,根本走不到权限控制逻辑。
修复后的正确写法示例:
// 错误写法 ("ADMINSTYLE", "display: none;"); // 正确写法 assign("ADMINSTYLE", "display: none;"); // 最后一行的渲染函数(假设是render) render("settings");
2. 权限逻辑覆盖问题
假设checkRights(n)返回true表示用户权限≥n,那么当用户是权限4时:
- 第一个
if (checkRights(4))会设置两个模块样式为空(即显示所有内容) - 但紧接着的
if (checkRights(3))也会成立(因为4≥3),这会把ADMINSTYLE重新设置为display: none;,导致权限4的用户也看不到ADMIN模块,完全违背了“权限4显示所有内容”的需求。
正确的逻辑应该是优先判断高权限,并用else if避免后续条件覆盖,同时可以在无权限的分支直接终止函数,优化执行流程:
function settings () { // 无权限2的用户直接提示并终止 if (!checkRights(2)) { showRightsInfo(); return; } // 先判断最高权限4:显示所有模块 if (checkRights(4)) { assign("STAMMDATENSTYLE", ""); assign("ADMINSTYLE", ""); } // 再判断权限3:仅显示stammdaten模块 else if (checkRights(3)) { assign("STAMMDATENSTYLE", ""); assign("ADMINSTYLE", "display: none;"); } // 权限为2的用户:隐藏所有模块 else { assign("STAMMDATENSTYLE", "display: none;"); assign("ADMINSTYLE", "display: none;"); } // 页面基础配置 assign("PAGETITLE", "Einstellungen"); assign("MAINPAGE", "a_settings"); render("settings"); // 执行页面渲染 }
3. 权限边界确认
需要额外确认checkRights()的具体逻辑:是判断用户权限大于请求等级,还是大于等于?如果checkRights(4)仅对权限4的用户返回true,checkRights(3)对权限3和4返回true,那之前的覆盖问题就必然发生,用else if是解决这类逻辑冲突的最稳妥方式。
内容的提问来源于stack exchange,提问作者RYU5




