3. 权限层级与对象授权

WinCC 的权限体系本质上是一套“编号—对象—用户”的三元映射:编号定义权限等级,对象声明所需权限,用户被授予若干编号。运行时,WinCC 将当前登录用户的权限集合与对象声明的权限编号做比对,决定该对象是否可操作。理解这条判定链,是做好最小权限授权的前提。

一、权限等级编号的定义方法

在 WinCC 中,权限等级以 1~999 的整数编号表示,编号本身没有内置语义,语义完全由项目定义。常见做法是按“操作危险度”分层,而不是按部门或岗位分层,因为岗位会变,危险度不会。一个可用的分层参考如下:

编号区间典型含义授权对象举例
1~99只读/监视趋势画面、报警列表、工艺参数显示
100~199常规操作启停泵、开关阀、设定值修改
200~299工艺参数调整PID 参数、配方切换、批量下载
300~399设备维护手动/自动切换、旁通、复位
400~499系统配置报警限值、通信参数、用户管理
900~999工程/调试脚本调试、强制输出、仿真模式

编号一旦确定,应写入项目《权限编号表》并冻结,后续新增权限只能追加,不能重排。重排编号会导致所有已授权对象和用户权限错位,是权限工程中最危险的操作之一。

二、把权限分配到对象

WinCC 中可授权的对象主要有五类,授权入口和生效方式各不相同:

  • 画面:在画面属性的“权限”栏填写编号。用户权限低于该编号时,画面无法打开,通常用于隔离工程师站画面。
  • 控件/按钮:在对象属性的“权限”栏填写编号。这是最常用的授权点,按钮的“鼠标点击”事件只有在权限满足时才触发。
  • 变量:在变量属性的“权限”栏填写编号。对变量授权可防止低权限用户通过脚本或 I/O 域间接改写关键变量。
  • 脚本:在全局脚本或画面脚本的属性中设置“权限”,脚本执行前会校验当前用户权限。
  • I/O 域:I/O 域的“输入”权限与“输出”权限可分别设置,实现“看得见但改不了”的效果。
授权编号应“就高不就低”:一个按钮若同时涉及启停和参数修改,应取两者中较高的编号,避免低权限用户绕过限制。

三、最小权限原则的落地

最小权限原则要求:用户只拥有完成其岗位职责所必需的最小权限集合。落地时按以下顺序推进:

  1. 梳理岗位清单,明确每个岗位需要操作哪些对象。
  2. 为每个对象标注所需权限编号,形成“对象—编号”对照表。
  3. 为每个岗位建立用户组,只勾选该岗位必需的编号。
  4. 用测试账号逐项验证:能操作的必须能操作,不能操作的必须被拒绝。

例如,某水处理项目定义:操作员组拥有 1、100;班长组拥有 1、100、200;维护组拥有 1、100、300;工程师组拥有 1、100、200、300、400、900。这样,操作员无法修改 PID 参数,班长无法进入维护模式,维护人员无法修改报警限值,职责边界清晰。

四、授权判定链与常见误区

运行时,WinCC 的判定顺序是:用户登录 → 读取用户所属用户组的权限编号集合 → 对象被触发时读取其权限编号 → 若用户集合包含该编号则放行,否则拒绝并可选记录审计事件。这条链决定了两个常见误区:

  • 只给按钮授权,忘了给变量授权:低权限用户可通过脚本直接写变量,绕过按钮限制。
  • 画面权限与按钮权限冲突:画面权限为 100,按钮权限为 300,则能进画面的用户仍无法操作按钮,这是正确行为,但需在设计中明确告知用户。
权限编号为 0 表示“不检查权限”,任何登录用户均可操作。除非确有必要,否则不要使用 0,尤其不要用于写操作对象。

五、授权配置示例

以下是一个按钮对象的授权配置片段(以 WinCC 对象属性为例),展示权限编号如何与对象绑定:

对象:btn_StartPump
  属性 → 权限:100
  事件 → 鼠标点击 → C 脚本:
    if (GetTagBit("PumpReady") == 1)
      SetTagBit("PumpRunCmd", 1);

对象:io_PID_Kp
  属性 → 输入权限:200
  属性 → 输出权限:1
  说明:低权限用户可看不可改

对象:scr_Engineer
  属性 → 画面权限:900
  说明:仅工程师组可打开

配置完成后,用操作员账号登录,尝试点击“启动泵”按钮应成功,尝试修改 Kp 应被拒绝,尝试打开工程师画面应无法打开。若结果与预期不符,优先检查用户所属用户组的权限编号是否勾选正确,再检查对象权限编号是否被误设为 0。

WinCC 权限判定链与对象授权关系 用户登录 operator01 所属组:操作员组 权限编号集合 { 1, 100 } 只读 + 常规操作 被操作对象及其权限编号 ● 按钮 btn_StartPump → 100 ● I/O 域 io_PID_Kp → 输入 200 / 输出 1 ● 画面 scr_Engineer → 900 读取 比对 判定结果 ✓ 允许 btn_StartPump(100 ∈ {1,100}) ✗ 拒绝 io_PID_Kp 输入(200 ∉ {1,100}) ✗ 拒绝 scr_Engineer(900 ∉ {1,100}) 审计事件记录 时间 | 用户 | 对象 | 所需权限 | 结果 | 备注 权限编号 0 = 不检查权限,任何登录用户均可操作,写操作对象应避免使用 最小权限原则:用户权限集合 = 岗位必需编号的最小并集

把权限编号表、对象授权表、用户组权限表三张表维护好,并在每次项目变更后重新验证,就能在保证操作便利的同时,把越权风险控制在可接受范围内。