Micrometer 1.17.2 修了 HttpSender 发 HTTP Basic 时会把密码两端空格裁掉的问题。密码写成前后各一个空格的 secret 时,1.17.1 实际发出去的是 secret,1.17.2 才原样保留。Spring Boot 4.1.2 已带到这版 Micrometer,4.1.1 仍是 1.17.1。

官方 Release Notes 对应条目是 Preserve whitespace in HTTP Basic authentication passwords(#8015)。旧实现在 withBasicAuthentication 里对密码做了 trim;RFC 7617 把 user-pass 拼成 user-id、冒号和密码,密码里的空白应保留。Pushgateway、部分 SaaS registry 若密码本身带首尾空格,旧版会鉴权失败。

实验项目

两个最小工程,分别钉 Spring Boot 4.1.1 和 4.1.2,依赖里带上 BOM 自带的 micrometer-core。再起一个只回显 Authorization 解码结果的小 HTTP 服务。应用启动后用 HttpUrlConnectionSender 发一条带 Basic 的 POST,然后退出。密码通过命令行传入,避免 application.properties 吃掉前导空格:

java -jar app.jar --demo.password=' secret '
HttpSender sender = new HttpUrlConnectionSender();
HttpSender.Response resp = sender.post(url)
    .withBasicAuthentication(user, pass)
    .withPlainText("ping")
    .send();

下列输出摘自同一次对照实测。回显服务收到请求后打印 USER=[...] PASS=[...] PASS_LEN=...。

1.17.1:两端空格被裁掉

LAB_PASSWORD_REPR=[ secret ] LAB_PASS_LEN=8
===== Boot 4.1.1 / Micrometer 1.17.1 =====
+ java -cp auth-server AuthEcho 19090  # pid=208747
AUTH_ECHO_LISTEN=19090
+ java -jar app-1171/target/mm-basic-ws-4.1.1-0.0.1-SNAPSHOT.jar --demo.password=' secret '
BOOT_VERSION=4.1.1
PASSWORD_LITERAL=[ secret ] PASS_LEN=8
HTTP_CODE=200
HTTP_BODY=USER=[metrics] PASS=[secret] PASS_LEN=6
----- AuthEcho saw -----
USER=[metrics] PASS=[secret] PASS_LEN=6

进程里拿到的字面量仍是 8 个字符,Authorization 里解码出来的密码只剩 secret,长度 6。首尾空格在组 Basic 头时被 trim 掉了。

1.17.2:原样发出

===== Boot 4.1.2 / Micrometer 1.17.2 =====
+ java -cp auth-server AuthEcho 19090  # pid=208854
AUTH_ECHO_LISTEN=19090
+ java -jar app-1172/target/mm-basic-ws-4.1.2-0.0.1-SNAPSHOT.jar --demo.password=' secret '
BOOT_VERSION=4.1.2
PASSWORD_LITERAL=[ secret ] PASS_LEN=8
HTTP_CODE=200
HTTP_BODY=USER=[metrics] PASS=[ secret ] PASS_LEN=8
----- AuthEcho saw -----
USER=[metrics] PASS=[ secret ] PASS_LEN=8

同一条密码,回显侧 PASS_LEN=8,方括号里前后空格都在。用户名未改。#8015 里说的 registry 鉴权失败,对应的就是旧版把密码裁成另一串之后去撞远端。

用户名侧的既有行为这次没动。密码为 null 的处理也保持原样。密码中间夹空格、本来就不被 trim 的场景,两个版本结果一样,这篇不展开。

和 Boot 版本的对应

Boot 4.1.1 的依赖树是 micrometer-core-1.17.1,4.1.2 是 1.17.2。只升 Boot 补丁即可带上这次修复;若仍停在 4.1.1,需要单独把 Micrometer 升到 1.17.2 或更高。

参考来源

— 感谢阅读 —
广告

一起交流

分享你的思考,让讨论更进一步。