Files
FileShare/docs/api/08-audit.md
T
SKYMirror 7f060dd0e4 26.9(安全审计修复版)
Go 1.27.1 (Gin+GORM) + Vue 3 文件快传服务:

- 安全审计全部修复(docs/security-audit-2026-09-05.md):
  bcrypt 密码哈希与自动升级、presign 直传服务端大小/内容校验、
  全局请求体上限、依赖升级(govulncheck 0 命中)、janitor 后台清理、
  管理端审计动作落库、/admin CORS 收紧、通知内容白名单净化、
  会话默认 7 天、限流缓存故障降级、robots.txt 端点等
- 前端:取件链接复制修复(不再重复拼接提取码)、markdown 净化器加固
- Redis 支持库号(FCB_REDIS_DB / redis://…/db URL)
- 文档:docs/api/* 与 openapi.yaml 同步最新行为(robots.txt、
  提码 5 位起、chunk 32MiB 上限、admin 审计动作等)

验证:gofmt/go vet/go test 全绿;二进制端到端冒烟通过
2026-09-05 04:22:41 +08:00

4.6 KiB
Raw Blame History

审计日志查询

所有上传/下载请求由审计中间件自动落库(需求 ③),管理端分页查询。 认证:Authorization: Bearer <token>

审计记录内容

每条审计日志覆盖以下维度(需求 ③):

维度 字段 说明
操作时间 created_at RFC 3339
客户端 ip 可信代理场景解析 XFF 后的真实 IP
终端信息 user_agent 原始 UA
设备解析 device_os / device_browser / device_type 由 UA 解析(如 Windows/Chrome/desktop
动作 action upload(上传类) / download(取件/下载类) / admin(管理端敏感操作,v2.5.6 新增)
结果 result success / denied(拒绝:401/403/423/428/ failed(失败:其余 4xx/5xx 或业务报错)
字节数 size_bytes 文件总大小;transferred_bytes 实际传输(Range 下载只计实际区间字节;下载由中间件自动统计,上传由各 handler 填充)
耗时 duration_ms 毫秒
角色 actor admin(有效管理员令牌)/ guest
业务 file_code / file_name 取件码 / 文件名(分片上传时 file_codeupload_id
错误 error_msg 失败/拒绝原因

命中审计的端点:上传类 POST /share/textPOST /share/file/chunk/upload*/presign*POST/PUT); 下载类 GET /share/downloadGET /share/selectGET /share/metadata 管理类(action=adminPOST /admin/loginPOST /admin/logoutPATCH|POST /admin/config/updatePATCH|POST /admin/settings/passwordPOST /admin/storage/switchPATCH|DELETE /admin/file/update|delete|batch-delete|batch-update|policy-action|batch-policy-action。 管理类动作未显式填结果时按 HTTP 状态兜底落库(401/403/423 → denied5xx → failed,其余 → success)。 失败与被拒绝的请求同样落库。

查询接口:GET /admin/audit/list

参数

参数 默认 说明
page 1 页码(≥1
size 20 每页条数(1~200;兼容 pageSize
action - upload / download / admin
result - success / denied / failed
ip - 按客户端 IP 过滤
start_time / end_time - 时间范围,ISO 8601(如 2025-06-01T00:00:00+08:00;也接受 2006-01-02 15:04:05 / 日期)
curl -s "http://localhost:8466/admin/audit/list?page=1&size=20&action=download&result=success&start_time=2025-06-01T00:00:00%2B08:00" \
  -H "Authorization: Bearer $TOKEN"

成功响应200):

{
  "code": 200, "msg": "ok",
  "data": {
    "data": [
      {
        "id": 318,
        "action": "download",
        "file_code": "K3P9W",
        "file_name": "report.pdf",
        "size_bytes": 1048576,
        "transferred_bytes": 524288,
        "ip": "203.0.113.7",
        "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
        "device_os": "Windows",
        "device_browser": "Chrome",
        "device_type": "desktop",
        "actor": "guest",
        "result": "success",
        "error_msg": "",
        "duration_ms": 128,
        "created_at": "2025-06-01T12:03:45+08:00",
        "fileCode": "K3P9W",
        "fileName": "report.pdf",
        "sizeBytes": 1048576,
        "transferredBytes": 524288,
        "userAgent": "Mozilla/5.0 …",
        "deviceOs": "Windows",
        "deviceBrowser": "Chrome",
        "deviceType": "desktop",
        "errorMsg": "",
        "durationMs": 128,
        "createdAt": "2025-06-01T12:03:45+08:00"
      }
    ],
    "total": 1180,
    "page": 1,
    "size": 20
  }
}

行字段以 snake_case 为准;camelCase 为兼容双份输出(文档不再重复列出)。

错误响应

{ "code": 400, "msg": "start_time 时间格式错误" }
{ "code": 401, "msg": "令牌无效或已过期" }

别名:GET /admin/audit/logs

/admin/audit/list 完全相同(同一 handler 的兼容别名),参数与响应一致。

典型查询

# 最近的下载行为
curl -s "http://localhost:8466/admin/audit/list?action=download&size=50" -H "Authorization: Bearer $TOKEN"

# 某 IP 的全部被拒请求(限流/鉴权失败)
curl -s "http://localhost:8466/admin/audit/list?ip=203.0.113.7&result=denied" -H "Authorization: Bearer $TOKEN"

# 今天 0 点以来的上传失败
curl -s "http://localhost:8466/admin/audit/list?action=upload&result=failed&start_time=2025-06-01T00:00:00%2B08:00" \
  -H "Authorization: Bearer $TOKEN"