用户管理
概述
本文档介绍 PlantPulse 平台的用户账户、安全组和权限管理方法。
用户管理在左侧菜单 System > 用户 (/user/index) 中执行。
用户结构
PlantPulse 的用户管理由三个核心要素组成。
- 用户(User): 登录平台的个人账户。
- 安全组(Security Group): 定义用户角色的组。每个用户属于一个安全组。
- 权限(Permission): 分配给安全组的功能级访问权限。控制对菜单、屏幕和 API 的访问。
三种角色
产品提供的角色只有三种。
| 角色 | 屏幕显示 | 用途 |
|---|---|---|
ADMIN | 系统管理员 | 全部功能。可修改他人密码和管理用户 |
API | API 开发者 | 外部系统集成账户 |
USER | 普通用户 | 基本功能 |
旧文档中提到这些角色名称,但产品中并不存在。用户注册
屏幕的角色选择中也不会出现。MANAGER 同样不存在。
最小权限原则:人员账户应从
USER开始,仅对需要管理的人员授予ADMIN。
用户属性
| 属性 | 必需 | 说明 |
|---|---|---|
| 用户 ID | O | 用于登录的唯一标识符(英文、数字,4~20 字符) |
| 用户名 | O | 屏幕上显示的名称 |
| 密码 | O | 登录密码(12~50 字符,参见下方 密码策略) |
| 电子邮件 | - | 接收通知的电子邮件地址 |
| 角色 | O | ADMIN / API / USER 之一 |
| 状态 | O | 活跃(Active)或停用(Inactive) |
| 描述 | - | 关于用户的备注 |
| 创建日期 | 自动 | 账户创建时间 |
| 最后登录 | 自动 | 最后一次登录时间 |
用户列表查询
选择左侧菜单 System > 用户 可查看已注册的用户列表。
- URL:
/user/index - 可查看用户 ID、名称、安全组、状态和最后登录时间。
- 使用搜索过滤器可快速找到特定用户。
说明: 只有属于 ADMIN 安全组的用户才能查看用户列表。
添加用户
- 在用户列表屏幕上点击 添加 按钮。
- 输入必需项。
- 用户 ID: 由英文和数字组成的唯一 ID(4~20 字符)
- 用户名: 屏幕上显示的名称
- 密码: 12~50 字符,必须包含英文大写字母、小写字母、数字和特殊字符中的至少 3 种。不符合则保存被拒绝。
- 角色: 选择
ADMIN/API/USER之一。
- 根据需要输入可选项(电子邮件、描述等)。
- 点击 保存 按钮。
注意: 用户 ID 创建后无法更改。请谨慎设置。
修改用户
- 在用户列表中点击要修改的用户。
- 修改可编辑的项(名称、电子邮件、安全组、状态、描述等)。
- 点击 保存 按钮。
说明: 用户 ID 无法修改。要更改 ID,必须删除现有用户并重新创建。
删除用户
- 在用户列表中选择要删除的用户。
- 点击 删除 按钮。
- 在确认弹窗中点击 确认。
警告: 删除的用户无法恢复。要临时禁用用户,建议使用 停用 而不是删除。
停用用户
要在不删除用户账户的情况下禁止登录,请使用停用功能。
- 在用户编辑屏幕中将 状态 改为
Inactive。 - 点击 保存 按钮。
停用的用户无法登录,但数据(审计日志、配置历史等)保持不变。要重新激活,请将状态改为 Active。
密码管理
密码在一个位置更改 — 左侧菜单 System > 用户 列表。
密码变更(更换初始密码)
这是安装后更换初始密码的方法。
- 打开左侧菜单 System > 用户。
- 点击目标用户行的 🔑 钥匙图标(提示:"密码变更")。
- 输入新密码。如果是本人账户则必须同时 输入当前密码。
- 保存。
谁可以更改谁的密码有明确的规则。
| 对象 | 必需权限 | 验证当前密码 |
|---|---|---|
| 本人 | 无(仅需登录) | 必需 — 错误将被拒绝 |
| 其他用户 | 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账户也被锁定时使用。
密码以 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、Cassandra、MinIO 等)的密码不按本文档操作, 而要按 密码变更(凭证轮换) 进行 — 顺序错误将导致平台无法启动。
密码策略
产品强制执行 — 违反以下规则保存将被拒绝。
| 项目 | 值 |
|---|---|
| 长度 | 12 字符以上 50 字符以下 |
| 复杂度 | 英文大写字母、小写字母、数字、特殊字符 4 种中的至少 3 种 |
产品不强制执行 — 应通过运营规程管理。以下项目平台 没有功能,需要的话请通过组织程序处理。
| 项目 | 状态 |
|---|---|
| 强制变更周期、过期 | 无 |
| 禁止重用旧密码 | 无 |
| 字典词汇阻止 | 无 |
| 账户永久锁定 | 无 — 但有以下临时阻止 |
暴力破解防护(临时阻止)
登录失败累积不会锁定账户,而是在一段时间内阻止请求
(HTTP 429 + Retry-After)。时间过后会自动解除,无需管理员操作。
| 设置 | 属性 | 默认值 |
|---|---|---|
| 启用功能 | engine.session.bruteforce.enabled | 启用 |
| 每 IP 允许失败次数 | engine.session.bruteforce.ip_limit | 30 次 |
| 每账户允许失败次数 | engine.session.bruteforce.user_limit | 10 次 |
| 聚合时间窗口 | engine.session.bruteforce.window.seconds | 300 秒(5 分钟) |
阻止按 IP 维度和账户维度分别 独立计数。如在办公室中多人共享同一公网 IP, 其他人的失败也会共同填充 IP 限额(30 次)。 阻止和失败都记录在审计日志(
LOGIN_BLOCKED/LOGIN_FAILURE)中。
安全组管理
默认安全组
PlantPulse 提供三个默认安全组。
| 安全组 | 说明 | 主要权限 |
|---|---|---|
| ADMIN | 系统管理员 | 全部功能访问(用户管理、系统设置、所有菜单) |
| OPERATOR | 运营人员 | 运营相关功能访问(监控、报警管理、数据查询) |
| USER | 普通用户 | 基本功能访问(仪表板查看、数据查询) |
添加安全组
除默认组外,可添加符合组织角色的安全组。
- 选择 安全管理 > 安全组 菜单。
- 点击 添加 按钮。
- 输入组 ID、组名称和描述。
- 点击 保存 按钮。
权限设置
为安全组设置菜单和功能级权限。
- 在 安全管理 > 安全组 菜单中选择组。
- 点击 权限设置 选项卡。
- 为每个菜单/功能勾选 读取、写入、删除 权限。
- 点击 保存 按钮。
权限设置示例:
| 菜单 | ADMIN | OPERATOR | USER |
|---|---|---|---|
| 连接管理 | 读取/写入/删除 | 读取/写入 | 读取 |
| 工厂管理 | 读取/写入/删除 | 读取/写入 | 读取 |
| 报警管理 | 读取/写入/删除 | 读取/写入 | 读取 |
| 用户管理 | 读取/写入/删除 | - | - |
| 系统设置 | 读取/写入/删除 | 读取 | - |
| 画布 | 读取/写入/删除 | 读取/写入 | 读取 |
访问控制
站点访问控制
在多站点环境中,可限制每个用户可访问的站点。
- 在用户编辑屏幕中选择 站点访问权限 选项卡。
- 勾选允许访问的站点。
- 点击 保存 按钮。
说明: 未设置站点访问权限的用户可访问所有站点。
画布共享
画布屏幕可与特定用户或安全组共享。
- 在画布编辑屏幕中点击 共享设置。
- 选择共享对象。
- 完全公开: 所有用户可访问。
- 安全组: 仅选定安全组的用户可访问。
- 指定用户: 仅选定用户可访问。
- 点击 保存 按钮。
会话管理
会话超时
用户会话超时的默认设置为 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 文件批量注册多个用户。
注册步骤
- 在 安全管理 > 用户管理 菜单中点击 Excel 上传 按钮。
- 下载模板 Excel 文件。
- 按模板格式填入用户信息。
| 列 | 必需 | 说明 | 示例 |
|---|---|---|---|
| user_id | O | 用户 ID | operator01 |
| user_name | O | 用户名 | 홍길동 |
| password | O | 初始密码 | Temp1234! |
| - | 电子邮件 | hong@example.com | |
| security_group | O | 安全组 ID | OPERATOR |
| description | - | 描述 | 생산1팀 |
- 上传已填写的 Excel 文件。
- 在预览中确认待注册的用户信息。
- 点击 注册 按钮。
说明: 上传时将执行有效性检查。如有重复 ID、必需项缺失等错误,该行将被标记,修正后可重新上传。
最佳实践
- 最小权限原则: 只给用户分配工作所需的最低权限。
- 最小化管理员账户: 保持 ADMIN 组用户数最少,常规运维使用 OPERATOR 组。
- 定期审计: 每季度审查用户列表和权限,停用不必要的账户。
- 离职处理: 离职时立即停用或删除账户。
- 禁止共享账户: 使用个人账户,避免使用共享账户。
- 密码管理: 确保更改初始密码,推动定期更换密码。
- 日志监控: 监控异常登录尝试(重复失败、非正常时间访问等)。
常见问题
登录失败
| 症状 | 原因 | 解决方案 |
|---|---|---|
| "用户 ID 或密码错误" | 密码输入错误 | 检查密码并重试。也检查 Caps Lock 状态。 |
| "账户已停用" | 账户处于 Inactive 状态 | 向管理员申请激活账户。 |
| "账户已锁定" | 连续登录失败导致锁定 | 向管理员申请解除锁定。 |
| 登录屏幕未显示 | Web 服务器未运行或网络问题 | 检查服务器状态和网络连接。 |
权限不足
| 症状 | 原因 | 解决方案 |
|---|---|---|
| 菜单不可见 | 安全组无该菜单的访问权限 | 向管理员申请添加权限。 |
| "无访问权限" 提示 | API 或功能权限不足 | 检查安全组的权限设置。 |
| 特定站点数据未显示 | 站点访问权限未设置 | 检查用户的站点访问权限。 |
会话过期
| 症状 | 原因 | 解决方案 |
|---|---|---|
| 工作中跳转至登录屏幕 | 会话超时(默认 30 分钟) | 重新登录。如超时过短,在 web.xml 中调整。 |
| 其他设备被登出 | 并发登录策略(KICK)强制退出 | 检查并发登录设置。 |
| 会话相关错误反复出现 | Redis 缓存故障 | 检查 Redis 服务状态。 |