You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为不同用户权限定义不同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的用户返回truecheckRights(3)对权限3和4返回true,那之前的覆盖问题就必然发生,用else if是解决这类逻辑冲突的最稳妥方式。


内容的提问来源于stack exchange,提问作者RYU5

火山引擎 最新活动