如何在OpenAPI代码生成阶段为接口添加@PreAuthorize注解?
问题背景
我正在使用openapi-generator-maven-plugin生成代码,插件配置如下:
<groupId>org.openapitools</groupId> <artifactId>openapi-generator-maven-plugin</artifactId> <version>6.0.1</version>
我需要给特定API方法加上@PreAuthorize注解,试过在实现类的重写方法上添加,但完全不生效——因为接口SomeApi会调用内部重写的getSomeInfo方法,Spring注解根本起不了作用。示例代码如下:
@RestController @Validated @Slf4j @RequiredArgsConstructor @RequestMapping("/api/v1") public class SomeController implements SomeApi { @Override @PreAuthorize("hasRole('ROLE_USER_ADMIN') || hasRole('ROLE_DIGITAL_REP') || hasRole('ROLE_FIELD_REP')") public ResponseEntity<SomeDto> getSomeInfo() { return ResponseEntity .status(HttpStatus.OK) .body("some info"); } }
想请教:能不能在代码生成阶段直接给API端点加上@PreAuthorize注解?
可行解决方案
针对你使用的6.0.1版本,有几种可靠的实现方式:
1. 用OpenAPI规范扩展字段(最推荐)
直接在你的OpenAPI YAML/JSON定义里,给目标API操作加上x-spring-preauthorize扩展字段,插件生成代码时会自动给对应方法添上@PreAuthorize注解。示例:
paths: /api/v1/some-info: get: summary: 获取某信息 x-spring-preauthorize: "hasRole('ROLE_USER_ADMIN') || hasRole('ROLE_DIGITAL_REP') || hasRole('ROLE_FIELD_REP')" responses: '200': description: 成功响应 content: application/json: schema: $ref: '#/components/schemas/SomeDto'
这种方式不用改模板,直接通过规范配置实现,完全符合OpenAPI的扩展生态。
2. 自定义代码模板
如果扩展字段满足不了你的需求,可以修改Spring相关的模板文件:
- 找到插件自带的
api.mustache(对应生成的接口类)或apiController.mustache(对应生成的控制器类)模板 - 在方法定义的位置添加
@PreAuthorize注解的逻辑,比如根据你自定义的扩展字段动态注入注解内容 - 在Maven插件配置里指定自定义模板的目录:
<plugin> <groupId>org.openapitools</groupId> <artifactId>openapi-generator-maven-plugin</artifactId> <version>6.0.1</version> <configuration> <templateDirectory>${project.basedir}/src/main/resources/openapi-templates</templateDirectory> <!-- 其他生成配置 --> </configuration> </plugin>
3. 升级插件版本(可选)
你之前关注的相关讨论问题已经在后续版本中得到完善,升级到7.x及以上版本后,x-spring-preauthorize扩展的支持更稳定,还能支持更多Spring Security相关注解的自动生成。
内容的提问来源于stack exchange,提问作者Ilia
相关产品推荐
相关产品推荐

