文章目录

组态软件中的用户登录验证脚本

发布于 2026-03-29 03:31:02 · 浏览 10 次 · 评论 0 条

组态软件中的用户登录验证脚本

在工业自动化系统中,组态软件是操作员与设备交互的核心界面。为了防止非授权人员误操作关键设备或修改系统参数,建立一套严密的用户登录验证机制至关重要。本指南将手把手教你如何在主流组态软件中编写并部署用户登录验证脚本,实现基于角色访问控制(RBAC)。


1. 准备工作与变量定义

在编写脚本前,必须先规划好数据存储结构和内存变量。大多数组态软件支持连接本地数据库、Excel 文件或内置内存区来存储用户信息。

确认以下要素

  1. 用户表结构:明确需要存储哪些字段。通常包含“用户名”、“加密密码”、“用户权限级别”。
  2. 全局变量:需要在画面中创建用于接收输入和显示状态的内存变量。
  3. 事件绑定:确定触发验证的代码位置,通常是登录按钮的“鼠标点击事件”或窗口打开事件。

请在数据库中按以下标准建立一张名为 tbl_Users 的表:

字段名称 数据类型 说明
UserID String 唯一标识,如 Admin
PasswordHash String 加密后的密码密文,不可明文存储
AccessLevel Int 权限等级,1 为操作员,3 为工程师
IsActive Boolean 账号状态,True 表示启用

创建完表后,返回组态画面编辑器,新建 三个内存变量:

  • v_LoginUser (String):存储当前输入的账号
  • v_InputPass (String):存储当前输入的密码
  • v_CurrentLevel (Int):存储当前会话的权限等级

2. 验证逻辑流程图

在进行代码编写前,理解验证的逻辑流向能避免死循环和逻辑漏洞。下图展示了标准的登录验证处理流程:

graph TD A["开始登录流程"] --> B["获取用户输入"] B --> C{"输入是否非空?"} C -- "否" --> D["提示错误:\n账号密码必填"] D --> B C -- "是" --> E["读取数据库记录"] E --> F{"是否存在该用户?"} F -- "否" --> G["提示错误:\n无效账号"] G --> H["记录失败日志"] H --> B F -- "是" --> I["比对密码哈希值"] I --> J{"密码匹配成功?"} J -- "否" --> K["提示错误:\n密码错误"] K --> L["计数错误尝试次数"] L --> M{"连续错误超过3次?"} M -- "是" --> N["锁定账号 30 分钟"] N --> B M -- "否" --> H J -- "是" --> O["清除错误计数器"] O --> P["设置全局权限等级"] P --> Q["关闭登录窗口"] Q --> R["刷新主界面菜单"] R --> S["结束"] D -.->|"刷新 UI"| A G -.->|"刷新 UI"| A K -.->|"刷新 UI"| A

3. 编写登录验证脚本

以通用的 VBScript 风格为例,以下脚本适用于支持 VBS 解释器的组态环境(如 KingView、Intouch 等)。请将此代码粘贴至登录界面的“确认按钮”点击事件回调函数中。

3.1 基础验证代码

Sub btnLogin_OnClick()
    ' 1. 获取输入框内容并去除首尾空格
    Dim strUser, strPass
    strUser = Trim(MemoryVar.v_LoginUser)
    strPass = Trim(MemoryVar.v_InputPass)

    ' 2. 基础非空校验
    If strUser = "" Or strPass = "" Then
        AlertMessage "错误", "用户名或密码不能为空!", vbCritical
        Return
    End If

    ' 3. 查询数据库验证身份
    Dim rs, dbConn
    Set dbConn = CreateObject("ADODB.Connection")
    dbConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=user.mdb;"

    ' 使用 SQL 防止注入攻击,虽然这里是内嵌简单查询
    Dim sqlQuery
    sqlQuery = "SELECT PasswordHash, AccessLevel FROM tbl_Users WHERE UserID='" & strUser & "' AND IsActive=True"

    Set rs = dbConn.Execute(sqlQuery)

    If Not (rs.EOF And rs.BOF) Then
        ' 4. 密码比对 (假设密码已加密,此处调用内部加密函数 HashCompare)
        If HashCompare(strPass, rs!PasswordHash) Then
            ' 5. 登录成功逻辑
            MemoryVar.v_CurrentLevel = rs!AccessLevel

            ' 6. 记录日志
            WriteLog "User: " & strUser & ", Status: Login Success"

            ' 7. 关闭登录窗体
            CloseWindow "frmLogin"
            OpenWindow "frmMain"
        Else
            ' 密码错误处理
            HandleWrongPassword()
        End If
    Else
        ' 用户不存在处理
        AlertMessage "错误", "用户不存在或被禁用!", vbExclamation
        LogFailedAttempt(strUser)
    End If

    dbConn.Close
End Sub

3.2 辅助函数封装

为了保持代码整洁,建议将重复功能封装为独立子过程。

处理密码错误计数

Sub HandleWrongPassword()
    Dim errCount
    ' 读取全局的错误计数器
    errCount = MemoryVar.v_ErrorCount + 1
    MemoryVar.v_ErrorCount = errCount

    If errCount >= 3 Then
        AlertMessage "警告", "连续错误超过限制,账户已暂时锁定!", vbStop
        ' 写入锁定时间戳
        MemoryVar.v_LockTime = TimeValue()
    Else
        AlertMessage "错误", "密码错误,剩余机会:" & (3 - errCount), vbExclamation
    End If
End Sub

记录安全日志

Sub WriteLog(msgContent)
    Dim logFile, logPath
    logPath = GetSystemDirectory() & "\Logs\login_log.txt"

    Set logFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(logPath, 8, True)
    logFile.WriteLine Now() & " | " & msgContent
    logFile.Close
End Sub

4. 安全性加固配置

原始脚本仅完成基本功能,工业现场需防范暴力破解和数据泄露。请执行以下加固步骤。

4.1 密码加密策略

切勿在数据库中明文存储密码。应在用户注册或修改密码阶段,将明文密码通过单向哈希算法处理后存入 tbl_Users

推荐使用的哈希公式逻辑如下:

$$ H = SHA256(Salt + Password) $$

其中 $Salt$ 为随机生成的字符串密钥。若无法集成复杂库,可使用组态软件自带的加密函数,例如:

' 伪代码示例
Function EncryptPW(rawPW)
    Dim encKey
    encKey = "MySecretSystemKey" 
    EncryptPW = Hex(HashMD5(encKey & rawPW))
End Function

4.2 防暴力破解机制

利用全局内存变量记录短时间内的失败尝试。如果在 $T$ 时间内失败次数 $N > 阈值$,则触发锁定。

参数名 默认值 作用
MaxFailTimes 3 允许的最大连续错误次数
LockDuration 30 锁定时长(分钟)
CleanInterval 10 错误计数器自动清零间隔(分钟)

在系统初始化脚本中加入检查逻辑,确保登录锁定时长未被跳过。

4.3 权限动态刷新

登录成功后,不要直接硬编码可见性。应编写一个通用函数,根据 $v_CurrentLevel$ 动态隐藏或禁用控件。

Sub ApplyPermission(level)
    ' 如果等级小于 3,隐藏工程设置按钮
    If level < 3 Then
        WindowControl("btnSetup").Visible = False
        WindowControl("btnParamEdit").Enabled = False
    End If

    ' 如果等级小于 2,隐藏生产数据导出按钮
    If level < 2 Then
        WindowControl("btnExportData").Visible = False
    End If
End Sub

在登录成功后的步骤中调用 此函数:ApplyPermission(MemoryVar.v_CurrentLevel)


5. 调试与测试步骤

脚本编写完成后,必须经过多场景测试才能上线。

  1. 正常登录测试

    • 输入 正确的用户名和密码。
    • 验证 是否能跳转至主画面。
    • 验证 v_CurrentLevel 是否正确赋值。
  2. 异常路径测试

    • 输入 错误的密码,观察是否弹出“密码错误”提示。
    • 连续 输入错误密码 3 次,验证 账号是否被锁定且后续登录失效。
    • 输入 不存在的用户名,检查 数据库是否记录了失败日志。
    • 测试 空输入情况,确保 界面无响应或提示合理。
  3. 并发压力测试

    • 模拟网络波动情况,确保数据库连接超时不会导致脚本崩溃(需在脚本中使用 On Error Resume Next 捕获异常)。
  4. 权限边界测试

    • 创建两个不同权限的账号。
    • 分别登录,检查 低权限账号是否能看到高权限账号可操作的菜单项。
    • 若能看到,修正 ApplyPermission 函数中的判断条件。

6. 常见故障排除

在实际部署过程中,可能会遇到脚本无法运行或验证总是失败的情况。请按顺序排查。

6.1 数据库连接失败

  • 现象:点击登录后无任何反应,或提示“找不到文件”。
  • 原因:数据库路径错误,或驱动未安装。
  • 解决检查 代码中的 Data Source 路径是否为绝对路径。在组态软件运行时目录下复制 数据库文件,避免使用 C:\Users\Admin\... 这种个人目录。

6.2 脚本语法报错

  • 现象:系统弹出红色错误框,显示第 X 行错误。
  • 原因:变量未定义或字符串引号不匹配。
  • 解决开启 脚本编辑器的语法检查功能。特别注意字符串拼接处的单引号 ' 是否闭合。

6.3 权限生效延迟

  • 现象:登录成功,但按钮依然不可用或可用状态不对。
  • 原因:窗口刷新时机过早,ApplyPermission 在控件加载前执行。
  • 解决移动 ApplyPermission 函数的调用位置到窗口 OnLoad 事件之后,或者在 OpenWindow 语句后立即手动刷新一次视图。

7. 审计与维护

安全机制建立后,定期维护同样重要。

  • 定期更新:每 3 个月更换 一次系统加密盐值(Salt),防止旧哈希表被撞库。
  • 日志清理:日志文件会占用磁盘空间,配置 任务计划程序,每周末执行 一次日志压缩或删除超过 30 天的日志。
  • 离职处理:人员变动时,立即 在数据库中修改 对应账号的 IsActive 状态为 False,而非仅仅删除账号,以便追溯历史操作。

完成上述所有配置与测试后,您的组态系统登录验证模块即构建完毕。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文