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、100;班长组拥有 1、100、200;维护组拥有 1、100、300;工程师组拥有 1、100、200、300、400、900。这样,操作员无法修改 PID 参数,班长无法进入维护模式,维护人员无法修改报警限值,职责边界清晰。
四、授权判定链与常见误区
运行时,WinCC 的判定顺序是:用户登录 → 读取用户所属用户组的权限编号集合 → 对象被触发时读取其权限编号 → 若用户集合包含该编号则放行,否则拒绝并可选记录审计事件。这条链决定了两个常见误区:
- 只给按钮授权,忘了给变量授权:低权限用户可通过脚本直接写变量,绕过按钮限制。
- 画面权限与按钮权限冲突:画面权限为 100,按钮权限为 300,则能进画面的用户仍无法操作按钮,这是正确行为,但需在设计中明确告知用户。
五、授权配置示例
以下是一个按钮对象的授权配置片段(以 WinCC 对象属性为例),展示权限编号如何与对象绑定:
对象:btn_StartPump
属性 → 权限:100
事件 → 鼠标点击 → C 脚本:
if (GetTagBit("PumpReady") == 1)
SetTagBit("PumpRunCmd", 1);
对象:io_PID_Kp
属性 → 输入权限:200
属性 → 输出权限:1
说明:低权限用户可看不可改
对象:scr_Engineer
属性 → 画面权限:900
说明:仅工程师组可打开
配置完成后,用操作员账号登录,尝试点击“启动泵”按钮应成功,尝试修改 Kp 应被拒绝,尝试打开工程师画面应无法打开。若结果与预期不符,优先检查用户所属用户组的权限编号是否勾选正确,再检查对象权限编号是否被误设为 0。
把权限编号表、对象授权表、用户组权限表三张表维护好,并在每次项目变更后重新验证,就能在保证操作便利的同时,把越权风险控制在可接受范围内。