# 功能测试报告_局域网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)仍然拦截,未引入鉴权/跨域回归。