跳到主要内容

用户管理

概述​

本文档介绍 PlantPulse 平台的用户账户、安全组及权限管理方法。 用户管理在左侧菜单 System > 用户 (/user/index) 中进行。

用户结构​

PlantPulse 的用户管理由三个核心要素组成。

  • 用户(User): 登录平台的单个账户。
  • 安全组(Security Group): 定义用户角色的组。每个用户属于一个安全组。
  • 权限(Permission): 分配给安全组的各功能访问权限。控制菜单、画面和 API 的访问。

三种角色​

产品提供的角色仅有三种。

角色画面显示用途
ADMIN系统管理员全部功能。可更改他人密码,可管理用户
APIAPI 开发人员外部系统集成账户
USER普通用户基本功能
不存在 OPERATOR · ENGINEER · VIEWER 角色

旧文档中曾出现这些名称,但产品中并不存在这些角色。在用户注册画面的角色选项中也不会出现。

MANAGER 仅是“半个”角色 — 请不要使用

MANAGER 与上面三种情况不同。

用户注册画面选项列表中没有。保存路径仅接受 ADMIN·API·USER
服务器访问控制有 — 设备指令执行规则、标签·连接·报警画面的写入按钮显示条件为“ADMIN 或 MANAGER”
POST /api/v5/user不检查角色值,MANAGER 会原样保存
登录后跳转分支仅 ADMIN·API → 仪表盘,USER → 共享画面两种 — MANAGER 账户会在加载画面卡住

因此,通过 API 设置 MANAGER 等同于让账户无法使用。 如果已有此类账户,请将角色更改为三者之一。

最小权限原则: 人工使用的账户从 USER 开始,仅向需要管理的人员授予 ADMIN。

用户属性​

属性必填说明
用户 ID是用于登录的唯一标识符(英文字母、数字,4~20个字符)
用户名是画面上显示的名称
密码是登录密码(12~50个字符,请参见下方密码策略)
邮箱-接收通知的电子邮件地址
角色是ADMIN / API / USER 之一
状态是启用(Active)或禁用(Inactive)
说明-关于用户的备注
创建时间自动账户创建日期时间
最后登录自动最后一次登录日期时间

查看用户列表​

选择左侧菜单 System > 用户 即可查看已注册的用户列表。

  • URL: /user/index
  • 可查看用户 ID、姓名、安全组、状态、最后登录日期时间。
  • 可使用搜索筛选器快速查找特定用户。

提示: 只有属于 ADMIN 安全组的用户才能查看用户列表。

添加用户​

  1. 在用户列表画面中,点击添加按钮。
  2. 输入必填项。
    • 用户 ID: 由英文字母和数字组成的唯一 ID(4~20个字符)
    • 用户名: 将在画面上显示的名称
    • 密码: 12~50个字符,且必须包含英文大写字母、小写字母、数字、特殊字符四类中的至少三类。不满足要求时,保存将被拒绝。
    • 角色: 选择 ADMIN / API / USER 之一。
  3. 根据需要输入可选项目(邮箱、说明等)。
  4. 点击保存按钮。

注意: 用户 ID 创建后无法更改。请谨慎设置。

编辑用户​

  1. 在用户列表中点击要编辑的用户。
  2. 更改可编辑的项目(姓名、邮箱、安全组、状态、说明等)。
  3. 点击保存按钮。

提示: 用户 ID 无法编辑。如需更改 ID,需删除原有用户并重新创建。

删除用户​

  1. 在用户列表中选择要删除的用户。
  2. 点击删除按钮。
  3. 在确认弹窗中点击确认。

警告: 已删除的用户无法恢复。如需临时阻止用户登录,建议使用禁用而非删除。

禁用用户​

如果希望在不删除账户的情况下阻止登录,可使用禁用功能。

  1. 在用户编辑画面中,将状态更改为 Inactive。
  2. 点击保存按钮。

被禁用的用户无法登录,但其数据(审计日志、设置历史等)将被保留。如需重新启用,请将状态更改为 Active。


密码管理​

密码仅在一个画面中更改 — 即左侧菜单 System > 用户 列表。

更改密码(替换默认密码)​

安装后更改默认密码的方法如下。

  1. 打开左侧菜单 System > 用户。
  2. 点击目标用户所在行的 🔑 钥匙图标(工具提示:“更改密码”)。
  3. 输入新密码。如果是本人的账户,还需同时输入当前密码。
  4. 保存。

谁能更改谁的密码有明确规则。

目标所需权限是否需要当前密码
本人无(只需已登录)需要 — 错误则拒绝
其他用户ADMIN不需要

若非 ADMIN 用户尝试更改他人密码,请求将被拒绝,并在服务器日志中留下审计记录。 成功的更改也会以 Password changed: session_user=[...], target_user=[...] 形式记录。

也可以通过 REST API 完成同样的操作。

POST /api/v5/user/{user_id}/password
Content-Type: application/json

{ "current_password": "<current-password>", "password": "<new-password>" }

遗忘密码处理​

  • 请管理员处理: 由 ADMIN 用户按上述流程重置。
  • 直接初始化数据库(紧急情况下): 仅当包括 ADMIN 账户在内全部锁定时使用。
使用 SHA-256 会导致账户永久锁定

密码以 BCrypt 哈希存储。若按旧文档中的 encode(digest(..., 'sha256'), 'hex') 方式写入值,登录时 BCrypt 验证将无法解析该字符串, 导致使用任何密码都无法登录。 由于这是本就在锁定状态下使用的流程,恢复手段将彻底消失。

表名也不是 pp_user,而是 USER_LOGIN。

先创建 BCrypt 哈希,然后写入该值。

# BCrypt 해시 생성 (htpasswd — apache2-utils / httpd-tools 패키지)
htpasswd -bnBC 10 "" '<new-password>' | tr -d ':\n'
# → $2y$10$... 형태의 문자열이 나옵니다
-- 비상 시에만. 위에서 만든 BCrypt 해시를 그대로 넣습니다.
UPDATE USER_LOGIN
SET PASSWORD = '<$2y$10$... paste-here>'
WHERE USER_ID = 'admin';

写入后必须立即用登录确认,成功后再通过画面按正常流程更改一次密码。 基础设施服务账户(PostgreSQL·Aster TSDB·RustFS等)的密码请遵循 更改密码(凭证轮换) — 顺序一旦打乱,平台将无法启动。

密码策略​

产品强制要求项 — 违反以下任一项,保存本身将被拒绝。

项目值
长度12个字符或以上,50个字符或以下
复杂度英文大写字母 · 小写字母 · 数字 · 特殊字符四类中至少三类

产品不强制要求项 — 需要通过运营规范来管理。以下项目平台未提供功能,如有需要,请通过组织流程来保障。

项目状态
强制更改周期 · 过期无
禁止重用旧密码无
字典词拦截无
账户永久锁定无 — 取而代之的是下方的临时阻断

暴力破解阻断(临时阻断)​

登录失败累积后,不是锁定账户,而是在特定时间内阻止请求 (HTTP 429 + Retry-After)。时间过后会自动解除,因此无需管理员干预。

设置属性默认值
功能启用engine.session.bruteforce.enabled启用
每个 IP 允许失败次数engine.session.bruteforce.ip_limit30次
每个账户允许失败次数engine.session.bruteforce.user_limit10次
统计窗口engine.session.bruteforce.window.seconds300秒(5分钟)

阻断分别基于 IP 和账户两个维度计算。办公室等多人共用同一公网 IP 的环境下,他人的失败也会累计到 IP 限额(30次)。 阻断和失败均会记录在审计日志(LOGIN_BLOCKED / LOGIN_FAILURE)中。


安全组管理​

默认安全组​

PlantPulse 提供三个默认安全组。

安全组说明主要权限
ADMIN系统管理员全部功能访问(用户管理、系统设置、所有菜单)
OPERATOR操作员运营相关功能访问(监控、报警管理、数据查询)
USER普通用户基本功能访问(仪表盘查看、数据查询)

添加安全组​

除默认组外,可根据组织角色添加额外安全组。

  1. 选择安全管理 > 安全组菜单。
  2. 点击添加按钮。
  3. 输入组 ID、组名、说明。
  4. 点击保存按钮。

权限设置​

为安全组设置菜单及功能权限。

  1. 在安全管理 > 安全组菜单中选择组。
  2. 点击权限设置选项卡。
  3. 为每个菜单/功能勾选读取、写入、删除权限。
  4. 点击保存按钮。

权限设置示例:

菜单ADMINOPERATORUSER
连接管理读取/写入/删除读取/写入读取
工厂管理读取/写入/删除读取/写入读取
报警管理读取/写入/删除读取/写入读取
用户管理读取/写入/删除--
系统设置读取/写入/删除读取-
画布读取/写入/删除读取/写入读取

访问控制​

站点访问控制​

在多站点环境下,可限制每个用户可访问的站点。

  1. 在用户编辑画面中,选择站点访问权限选项卡。
  2. 勾选允许访问的站点。
  3. 点击保存按钮。

提示: 未设置站点访问权限的用户可访问所有站点。

画布共享​

画布画面可与特定用户或安全组共享。

  1. 在画布编辑画面中,点击共享设置。
  2. 选择共享对象。
    • 完全公开: 所有用户均可访问。
    • 安全组: 仅选定的安全组用户可访问。
    • 指定用户: 仅选定的用户可访问。
  3. 点击保存按钮。

会话管理​

会话超时​

用户会话超时默认为30分钟。30分钟内无活动将自动注销。

如需更改会话超时,请在 web.xml 中修改设置。

<!-- WEB-INF/web.xml inside the webapp (bundled in the WAR — reset on deploy, so change it in the source) -->
<session-config>
<session-timeout>30</session-timeout> <!-- in minutes -->
</session-config>

并发登录​

默认情况下,同一账户可在多个浏览器/设备上同时登录。在安全要求较高的环境中,建议为每个用户单独签发账户,并通过 IP 访问限制等网络级控制作为补充。


审计日志​

用户的主要活动会自动记录在审计日志中。通过审计日志可追踪系统变更历史。

记录的活动:

活动类型说明
登录/注销用户认证事件
用户管理用户创建、编辑、删除、禁用
安全组变更组创建、编辑、删除、权限变更
系统设置变更属性、连接信息等设置更改
数据修改工厂、设备、点位等主数据变更

审计日志可在工具 > 审计日志菜单中查看,并可按时间段、用户、活动类型进行筛选。


批量用户注册​

如需一次性注册多个用户,可使用 Excel 文件进行批量注册。

注册流程​

  1. 在安全管理 > 用户管理菜单中,点击Excel 上传按钮。
  2. 下载 Excel 模板文件。
  3. 按模板格式填写用户信息。
列必填说明示例
user_id是用户 IDoperator01
user_name是用户名홍길동
password是初始密码Temp1234!
email-邮箱hong@example.com
security_group是安全组 IDOPERATOR
description-说明생산1팀
  1. 上传填写好的 Excel 文件。
  2. 在预览画面中确认要注册的用户信息。
  3. 点击注册按钮。

提示: 上传时会进行有效性验证。如存在重复 ID、缺少必填项等错误,会显示对应行,可在修改后重新上传。


最佳实践​

  • 最小权限原则: 仅向用户分配业务所需的最小权限。
  • 最小化管理账户: ADMIN 组用户保持在最少数量,日常运营请使用 OPERATOR 组。
  • 定期审计: 每季度检查用户列表和权限,禁用不必要的账户。
  • 离职员工处理: 离职时立即禁用或删除其账户。
  • 禁止共享账户: 请使用个人账户,避免使用共享账户。
  • 密码管理: 引导用户必须更改初始密码,并鼓励定期更换密码。
  • 日志监控: 监控异常登录尝试(连续失败、非工作时间访问等)。

常见问题​

登录失败​

症状原因解决方法
登录失败
请重新确认用户名或密码。
用户名输入错误 · 密码错误 · 账户不存在 · 账户被禁用 — 四种情况均为同一提示重新确认用户名和密码(含大小写)。若仍不行,请在用户列表中确认账户是否有效
登录尝试次数过多(请在N秒后重试)连续失败导致阻断(HTTP 429)按提示等待相应秒数。这不是管理员可解锁的锁定 —— 时间过后会自动解除
登录画面不显示Web 服务器未运行或网络问题请检查服务器状态和网络连接
不存在名为“解除账户锁定”的管理员功能

连续失败阻断仅通过时间窗口解除(默认为300秒)——管理员画面中没有解除按钮。 如有咨询,正确答案是“稍等几秒后再试”。 如需更改阈值,请参考登录失败时应对中的 engine.session.bruteforce.*。

被禁用的账户也会显示与密码错误相同的提示。用户无法得知自己的账户是否被禁用, 因此管理员需要代为在列表中确认状态。

权限不足​

症状原因解决方法
菜单不显示安全组无该菜单访问权限请向管理员申请添加权限。
显示“无访问权限”消息API 或功能权限不足请确认安全组的权限设置。
特定站点数据不显示站点访问权限未设置请确认用户的站点访问权限。

会话过期​

症状原因解决方法
操作中跳转至登录画面会话超时(默认30分钟)请重新登录。若超时时间过短,请在 web.xml 中调整。
在其他设备上被注销并发登录策略(KICK)强制下线请确认并发登录设置。
反复出现会话相关错误Redis 缓存故障请检查 Redis 服务状态。