READMESource: main@be24606d
@weibaohui/user-management
用户管理 + 登录门禁:给 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 即生效。
使用
- 首次访问 Web UI 会自动进入注册页——第一个注册的账号就是管理员
- 管理入口:Web UI → 设置页 → 用户管理
- 管理员:用户表(新增用户 / 重置密码 / 角色调整 / 禁用启用 / 删除)+ 登录记录 / 访问记录 / 操作日志 / IP 封禁四个管理页
- 普通用户:个人信息卡 + 修改密码 + 自己的登录记录
- 数据与审计文件都在
~/.dsh/user-management/(users.json/sessions.json/activity.jsonl/audit.jsonl/bans.json,0600 权限,原子写;审计账本滚动保留最近 5000 条) - IP 封禁按连接源地址(
remoteAddress)判定:若部署在反向代理之后,看到的是代理的 IP——需要按真实客户端 IP 封禁时请勿加代理层直连使用
安全边界(务必阅读)
- 门禁是"进门"级别:进门之后,所有登录用户看到的是同一个 dsh 实例的会话与数据——本插件做的是"谁能访问",不是多用户数据隔离
- 拦截机制:宿主路由表没有中间件机制,插件通过宿主公开的
webServer.server实例重排request/upgrade监听器实现真·全局拦截(含/api、/plugins);这属于对公开字段的非常规使用,dsh 大版本升级后可能失效——失效时自动降级为路由级网关(/api由宿主自带的 Host/Origin 信任检查兜底),启动日志会明确提示degraded to route-level gate - 开放注册:注册始终开放(新账号均为普通用户),请勿将 dsh web 暴露给不受信任的网络
- 审计口径:操作日志不记录请求体内容与静态资源;被门禁拒绝的请求(401/302)不记录,防止扫描刷屏;临时密码、明文密码永不落盘、不进日志
联系我 :飞书群

No comments yet. Be the first to write one.