Back to home@weibaohui

user-management

dsh 插件 · 用户管理:dsh web 登录门禁 + 用户/角色/登录记录/访问记录管理,首个注册者即管理员

Stars
0
Language
JavaScript
Created
Sep 4, 2026
Updated
Sep 4, 2026
GitHub repo

Introduction

@weibaohui/user-management

DSH plugin npm version

用户管理 + 登录门禁:给 dsh web 加一道登录验证——未登录访问任何页面自动跳到登录/注册页,API 与 WebSocket 一律 401;内置管理员/普通用户两级角色,管理员管所有用户(删除、重置密码、角色调整)并查看登录记录、访问记录、操作日志,普通用户只能查看和修改自己的信息。

核心功能

  • 全局登录门禁:未登录的页面访问 302 跳转 /login,未登录的 API 请求、WebSocket 升级直接 401;登录页为插件自带的独立页面(登录 / 注册双 Tab),不依赖宿主前端,深浅色自适应
  • 首个注册者即管理员:系统内没有任何账号时,第一个注册的账号自动成为管理员,此后注册的都是普通用户
  • 用户管理(仅管理员):用户列表(角色 / 创建时间 / 最后登录)、新增用户(可选管理员或普通用户角色)、删除用户、重置密码(生成随机临时密码,仅展示一次)、提升 / 降级角色、禁用 / 启用账号(禁用立即踢出会话并拒绝登录);最后一个管理员不可删、不可降、不可禁
  • 三本审计账:登录记录(登录 / 登录失败 / 登出 / 改密 / 注册 / 重置密码 / 角色变更 / 删除 / 禁用 / 封禁等)、访问记录(页面级访问)、操作日志(经过门禁的每一次 API 调用与 WebSocket 连接,含方法 / 路径 / 响应状态 / 来源 IP),均支持按用户、类型、路径、状态过滤
  • IP 封禁:管理员可将来源 IP 加入封禁列表——命中地址在会话校验之前就被 403 拒绝(登录页也看不到);服务端拒绝封禁当前请求所用的 IP,防止把自己锁在门外
  • 自助服务(所有登录用户):查看自己的信息、修改密码(点击左上角头像/用户名 → 修改密码,改密后其他会话全部登出)、查看自己的登录记录
  • 会话持久:7 天滑动过期,dsh 重启不掉线;HttpOnly Cookie,密码 scrypt 加盐哈希,零第三方依赖

安装

dsh plugin --profile web add @weibaohui/user-management -w

装完重启 dsh web 即生效。

使用

  1. 首次访问 Web UI 会自动进入注册页——第一个注册的账号就是管理员
  2. 管理入口:Web UI → 设置页 → 用户管理
  3. 管理员:用户表(新增用户 / 重置密码 / 角色调整 / 禁用启用 / 删除)+ 登录记录 / 访问记录 / 操作日志 / IP 封禁四个管理页
  4. 普通用户:个人信息卡 + 修改密码 + 自己的登录记录
  5. 数据与审计文件都在 ~/.dsh/user-management/users.json / sessions.json / activity.jsonl / audit.jsonl / bans.json,0600 权限,原子写;审计账本滚动保留最近 5000 条)
  6. IP 封禁按连接源地址(remoteAddress)判定:若部署在反向代理之后,看到的是代理的 IP——需要按真实客户端 IP 封禁时请勿加代理层直连使用

安全边界(务必阅读)

  • 门禁是"进门"级别:进门之后,所有登录用户看到的是同一个 dsh 实例的会话与数据——本插件做的是"谁能访问",不是多用户数据隔离
  • 拦截机制:宿主路由表没有中间件机制,插件通过宿主公开的 webServer.server 实例重排 request / upgrade 监听器实现真·全局拦截(含 /api/plugins);这属于对公开字段的非常规使用,dsh 大版本升级后可能失效——失效时自动降级为路由级网关(/api 由宿主自带的 Host/Origin 信任检查兜底),启动日志会明确提示 degraded to route-level gate
  • 开放注册:注册始终开放(新账号均为普通用户),请勿将 dsh web 暴露给不受信任的网络
  • 审计口径:操作日志不记录请求体内容与静态资源;被门禁拒绝的请求(401/302)不记录,防止扫描刷屏;临时密码、明文密码永不落盘、不进日志

联系我 :飞书群

link