编辑 | blame | 历史 | 原始文档

功能测试报告_局域网IP访问登录CORS修复_2026-09-16

模块:系统安全(跨域白名单)+ 登录 测试人: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 注释)。

二、测试环境

  • 后端:8090,改后按 PID 精确重启(cmd→java(maven)→java(app)),Started TrafficAuditApplication / Tomcat started on port(s): 8090 (http)。
  • 前端:8080,dev-server 未重启,页面与代理沿用本次启动实例。
  • 浏览器:Codex 应用内浏览器,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 通过

四、发现的问题与处置

  1. CORS 白名单过窄导致局域网 IP/同源 IP 访问登录失败(本次主问题):已改为按模式放行本机 + 内网网段,见上;非法外部来源仍 403。
  2. 前端 dev 日志显示 Network: unavailable(vue-cli 未探测到网卡地址),但 8080 实际监听 0.0.0.0、局域网访问正常(C5 实测),属日志提示问题,不处理。
  3. 「网络错误,登录失败」这一提示把 403/500 等有响应的错误也归到"网络错误",排查时容易误导;Login.vue 未改动,列为后续可选优化项。

五、结论

局域网 IP(http://192.168.177.26:8080/)登录失败问题已修复,命令行走查(C4/C6/C7/C8/C9/C10/C12)与真实浏览器端到端登录(C5)全部通过,白名单负向用例(C11)仍然拦截,未引入鉴权/跨域回归。