Files
usernode/config.example.toml
T
cao.wangrenbo 630d240dc0 feat(M1): 认证与用户管理 — 双通道登录、cookie 会话、用户 CRUD 与真实系统账号对接
认证:
- 图形验证码 GET /auth/captcha(内置 PNG 渲染,零第三方依赖)
- 外部用户 OTP 双通道:DB 存储(otp_codes)使邮件与 CLI 共用同一验证码/冷却/失败限速
- 管理员 bcrypt 登录 + 连续失败限速锁定;admin/forgot + admin/reset 邮件重置(SMTP 或日志)
- cookie 会话(HttpOnly/SameSite)、me/logout、admin/user 鉴权中间件

用户管理(admin):
- CRUD + disable/enable/extend/delete,对接 system 层真实 useradd/usermod/userdel/passwd
- system 层三执行模式:dry-run(默认,安全)/ direct(容器/测试用户)/ sudo(生产 sudoers 白名单)
- Exists 系统账号一致性检查;deploy/sudoers.example 白名单模板
- 关键操作接入 append-only 审计

其他:
- CLI user otp 改 DB store,与邮件通道真正对齐
- 容器镜像补 shadow(alpine 无 useradd);Makefile VERSION 0.2.0-m1
- 测试:auth/service 单测 + api httptest 集成 + 容器内真实系统账号端到端验证
2026-08-29 23:40:20 +08:00

54 lines
2.3 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ws_usernode 服务器用户管理节点 —— 配置示例
# 复制为 config.toml 后按需修改;敏感项(SMTP 密码)建议通过环境变量覆盖:
# USERNODE_SMTP_PASSWORD=xxx
# 环境变量覆盖规则:USERNODE_<SECTION>_<FIELD>(字段名 camelCase 转大写蛇形;
# 连续大写缩写按一个词处理),例如 USERNODE_DATABASE_DSN、
# USERNODE_POLICY_OTPTTL、USERNODE_POLICY_DEFAULT_TTL。
[app]
name = "ws_usernode"
env = "development" # development / production
base_url = "http://127.0.0.1:8080" # 对外访问地址(邮件重置链接等)
[server]
listen = "127.0.0.1:8080" # 生产建议 0.0.0.0:8080 并置于反向代理后
session_ttl = "24h" # cookie 会话时长
trusted_proxies = ["127.0.0.1", "::1"]
[database]
driver = "sqlite" # sqlite(开发)/ mysql(生产)
dsn = "data/usernode.db" # sqlite 文件路径;mysql 形如
# usernode:pass@tcp(127.0.0.1:3306)/usernode?charset=utf8mb4&parseTime=True&loc=UTC
[log]
level = "info" # debug / info / warn / error
format = "text" # text / json
[policy]
default_ttl = "2160h" # 新账号默认有效期 90 天(可被管理员创建/延期时覆盖)
recycle_period = "720h" # 到期后回收期 30 天,期内可延期恢复
audit_retention = "720h" # 审计保留 30 天,保留前先归档
otp_ttl = "10m" # OTP 验证码有效期
otp_cooldown = "60s" # OTP 发送冷却
[auth]
max_login_failures = 5 # 管理员登录连续失败阈值,达到后锁定
lock_duration = "15m" # 锁定持续时间
captcha_ttl = "5m" # 图形验证码有效期
[smtp]
host = "" # 留空则禁用邮件(OTP 仍可用 CLI 通道获取)
port = 587
username = ""
password = ""
from = "usernode@example.com"
[system]
sudo = false # 生产 true:经 sudo -n 执行 useradd/usermod/userdel/passwd(需 deploy/sudoers
dry_run = true # 开发演练 true:只打印计划命令不执行;false 且 sudo=false 时直接执行(容器/测试用户验证)
user_prefix = "ext_" # 外部用户系统账号统一前缀
group = "external" # 外部用户统一组
shell = "/bin/sh" # 默认 shell
home_base = "/home" # 家目录基路径
authorized_keys_dir = ".ssh" # authorized_keys 所在目录名