一、一些想法

  1. AI编码已经比较成熟了,从AI IDE和插件比如代码自动补全,简单功能函数,写单元测试,到基于Prompt直接实现完整接口模块,前端应用和APP等。我把前者理解为AI辅助编程,后者称为AI Vibe Coding

  2. 如果你是一个后端开发或者产品经理,AI在你不熟悉的领域比如前端、APP也能让你想法落地;即使你使用一种编程语言多年,AI也能帮你解决使用过程中的疑难问题,写脚手架类似代码等。其实作为普通程序员,技术深度和广度怎么都拼不过AI的

  3. 未来AI代码覆盖率占比会越来越多地作为一个核心指标出现在研发部门的考核指标中

  4. 当前程序员手搓编程方式我称之为古法编程,未来只是作为一种兴趣爱好。类似现在的DIY手工等

二、一个例子

针对上面的想法二,这里举一个例子。

在项目中使用过TRAE、CodeBuddy、Claude Code等。以最近在Jetbrain IDEA中开发Spring Cloud应用为例,我接入的是阿里云百炼的Coding Plan Pro 高级套餐

项目架构简单讲通过Spring Gateway转发请求到各个Spring Boot后端业务服务。授权认证在Gateway中实现,后端服务不再验证。

这两天有个后端项目新增了一个接口,在Gateway转发到后端服务后,后端服务一直触发Spring Security Filter流程中的一个异常,导致Spring Boot服务启动失败。

比较纠结的是新增的接口使用方式和存量接口类似,存量接口没有这个异常。

在IDEA中问Claude CodeCC如下

1
2
3
4
为什么请求/core/open/xxx/getHotelProducts不会触发 @../com/cloud/dog-common-security/1.0.1-SNAPSHOT/dog-common-security-1.0.1-S 
NAPSHOT-sources.jar!/com/dog/common/security/component/DogUserAuthenticationConverter.java#L95
方法的调用;但是请求/core/open/xxx-open-api/hotel/api/hotel-info/query-product-list会触发呢?

CC回复如下

这个原因分析不正确。因为在业务服务层不做Spring Security认证,已经做了配置忽略所有接口了。

1
2
3
4
5
6
## spring security 配置           
security:
oauth2:
client:
ignore-urls:
- /**

很快CC给了一个关键提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
这是一个研究性问题。让我仔细分析一下。
根据您提供的配置,ignore-urls 包含 /**,理论上所有路径都应该被放行。但您观察到的现象是两个接口行为不同。
让我问几个问题来确认:

⏺ User answered Claude's questions:
⎿  · 您说 RedAug 接口 "不触发" DogUserAuthenticationConverter.getAuthorities(),请确认一下:是请求不带 Authorization header
也能成功?还是带了 Authorization header 但没有调用这个方法? → 不需要任何认证信息

⏺ 根据您的确认,RedAug 接口不需要任何认证信息就能成功,而 Tumei 接口需要认证。这说明 /** 白名单配置可能只对部分路径生效。

这是一个很奇怪的现象。让我检查一下是否有其他配置或代码影响了这个行为。

⏺ Searched for 1 pattern, read 1 file (ctrl+o to expand)

⏺ 让我检查 DogSecurityBeanDefinitionRegistrar,看看是否有其他配置被注册。

⏺ Read 1 file (ctrl+o to expand)

⏺ 我发现了一个关键点!DogSecurityBeanDefinitionRegistrar 会检查是否已存在 RESOURCE_SERVER_CONFIGURER bean,如果存在就不会注册默认的
DogResourceServerConfigurerAdapter。

让我检查 biztravel-core 项目中是否有自定义的 ResourceServerConfigurerAdapter。

⏺ Searched for 1 pattern (ctrl+o to expand)

⏺ 这是关键信息!现在我明白了原因:

问题根因

RedAug 接口不带 Auth header,Tumei 接口带了 Auth header

Spring Security OAuth2 的行为

当配置了 /** 白名单(permitAll())时:

1. 不带 Authorization header 的请求
- Spring Security 检测到没有 token,直接跳过 token 验证
- 由于路径在白名单中,请求被放行
- 不会调用 DogUserAuthenticationConverter.getAuthorities()
2. 带 Authorization header 的请求
- Spring Security 检测到有 token,需要验证 token
- 调用 RemoteTokenServices.loadAuthentication() 验证 token
- 在验证过程中调用 DogUserAuthenticationConverter.extractAuthentication() 提取用户信息
- 会调用 getAuthorities() 方法

结论

permitAll() 配置的含义是:不需要认证也可以访问,而不是忽略 token 验证。

如果请求带了 Authorization header,即使路径在白名单中,Spring Security 仍然会尝试验证 token 并提取用户信息。这是 Spring Security OAuth2 的默认行为。

解决方案

如果您希望 Tumei 接口也不触发 token 验证,有两个选择:

1. 客户端请求时不带 Authorization header
2. 在代码中添加逻辑跳过 token 验证(需要自定义配置)

问题原因比较清楚了,新增接口从Gateway转发请求到业务服务时带了 Authorization header 触发业务应用的Spring Security Filter流程。在Gateway去掉这个Header头就OK了。

如果请求带了 Authorization header,即使路径在白名单中,Spring Security 仍然会尝试验证 token 并提取用户信息。这是 Spring Security OAuth2 的默认行为。这个知识点其实我是不知道的,如果没有AI定位,估计这个问题调查够喝一壶的。

三、最后

拥抱AI,使用过后再来评价它的优点或者不足。

已有的知识既可能让你更好的理解AI,也可能因为已有的编程思维不能以正确姿势使用Prompt Vibe Coding。