模块:系统安全(跨域白名单)+ 登录 测试人:Codex 日期:2026-09-16
问题现象:用 http://192.168.177.26:8080/ 打开页面,登录页能正常显示,但点「登录」提示「网络错误,登录失败」;同一套服务用 http://localhost:8080/ 登录正常。
根因:浏览器对 POST/PUT/DELETE 必带 Origin 头(GET 不带)。9-14 安全整改把 CORS 从 allowedOriginPattern("*") + allowCredentials(true) 收紧为只列具体来源(http://localhost:8080,http://127.0.0.1:8080)。经 dev-server 代理时 Origin 原样转发给后端,于是 Origin: http://192.168.177.26:8080 命中不了白名单,CorsFilter 直接返回 403 Invalid CORS request(实测报文见用例 C2)。
这解释了"页面正常、一登录就网络错误":页面 HTML/JS 与 GET /api/auth/captcha-config 都不带 Origin 因而不受影响(登录页能显示"测试模式"提示即证明该 GET 成功)。
连带风险(本次一并解决):打包部署是前端内嵌、与接口同源在 8090,浏览器 POST 同样会带 Origin: http://<部署机IP>:8090,用 IP 访问时会同样被 403 挡住登录。
改动(2 个文件,CorsConfig.java / application.yml):
config.setAllowedOrigins(...) → config.setAllowedOriginPatterns(...),默认来源放宽为本机 + 内网网段:http://localhost:*、http://127.0.0.1:*、http://192.168.*:*、http://10.*:*、http://172.*:*。allowCredentials 仍为 false;如改用域名访问,需把域名(含端口)追加到 app.cors.allowed-origins(已写入 yml 注释)。cmd→java(maven)→java(app)),Started TrafficAuditApplication / Tomcat started on port(s): 8090 (http)。http://192.168.177.26:8080/#/login(真实浏览器路径,非模拟)。curl.exe 直发同一 URL,用于区分"服务端拒绝"与"浏览器侧失败"。admin(本机库密码 123456)。| 编号 | 用例 | 输入 | 预期 | 实际 | 结论 |
|---|---|---|---|---|---|
| C1 | 复现(修复前,浏览器) | 192.168.177.26:8080/#/login 输入 admin/123456 点登录 |
复现"网络错误,登录失败" | 页面提示「网络错误,登录失败」,URL 停在 #/login |
复现成功 |
| C2 | 复现(修复前,命令行) | POST /api/auth/login,带 Origin: http://192.168.177.26:8080 |
能定位到服务端拒绝 | HTTP/1.1 403 Forbidden + Invalid CORS request |
复现成功(定位根因) |
| C3 | 对照(修复前) | 同 C2 但不带 Origin |
正常 | 200 且返回 token | 通过(证明差异来自 Origin) |
| C4 | 修复后 LAN 来源 | POST /api/auth/login,带 Origin: http://192.168.177.26:8080 |
200 | 200 + token(管理员/5 模块) |
通过(正向) |
| C5 | 修复后浏览器实登 | http://192.168.177.26:8080/#/login 输入 admin/123456 |
登录成功进工作台 | 提示「登录成功」,跳转 #/dashboard,顶部显示 admin |
通过(正向,端到端) |
| C6 | 本机来源回归 | Origin: http://localhost:8080 |
200 | 200 | 通过(无回归) |
| C7 | 同源部署场景 | 直连 8090,带 Origin: http://192.168.177.26:8090 |
200 | 200 | 通过(正向) |
| C8 | 内网网段来源 | 带 Origin: http://10.1.2.3:8080 |
200 | 200 | 通过(正向) |
| C9 | 预检请求 | OPTIONS /api/auth/login + Origin: http://192.168.177.26:8080 |
200 且回显放行来源 | 200,Access-Control-Allow-Origin: http://192.168.177.26:8080,方法 GET,POST,PUT,DELETE,OPTIONS |
通过 |
| C10 | 无 Origin 头 | POST /api/auth/login(curl 直连 8090) |
不受影响 | 200 | 通过 |
| C11 | 非法来源 | Origin: http://evil.example.com |
拒绝 | 403 Invalid CORS request |
通过(负向,白名单仍生效) |
| C12 | 带令牌业务接口 | LAN 来源 + Bearer 令牌 GET /api/user/list |
200 | 200 | 通过 |
Network: unavailable(vue-cli 未探测到网卡地址),但 8080 实际监听 0.0.0.0、局域网访问正常(C5 实测),属日志提示问题,不处理。Login.vue 未改动,列为后续可选优化项。局域网 IP(http://192.168.177.26:8080/)登录失败问题已修复,命令行走查(C4/C6/C7/C8/C9/C10/C12)与真实浏览器端到端登录(C5)全部通过,白名单负向用例(C11)仍然拦截,未引入鉴权/跨域回归。