Spring Boot如何配置Controller端点仅在特定生命周期环境可用
Spring Boot 按环境控制删除接口访问权限实现
已定义的删除接口
当前项目中已经开发完成的两个文章删除接口为:
- 按id删除单篇文章:
DELETE /articles/:id - 删除全部文章:
DELETE /articles/
访问控制规则
两个删除接口仅在dev开发环境开放调用权限,test测试、staging预发布、production生产环境下必须拦截禁用,不允许执行任何删除操作。
具体实现方式
自定义Web拦截器实现(推荐,对现有代码无侵入)
- 写自定义类实现Spring的
HandlerInterceptor接口,类中注入Spring的Environment实例,用来读取当前项目激活的环境标识 - 在拦截器的
preHandle方法中写判断逻辑:- 校验当前请求是不是DELETE方法,且请求路径匹配两个删除接口的规则
- 校验当前激活的profile不包含dev
- 两个条件同时满足时,直接返回403权限不足的响应,中断后续的请求流程,不会触发实际的删除业务逻辑
- 将这个自定义拦截器注册到
WebMvcConfigurer的拦截链中,绑定匹配路径为所有/articles下的DELETE请求
这个方案的优势是完全不用改动原有Controller的业务代码,所有拦截逻辑都集中在独立的拦截器类里,后续要调整拦截路径、调整允许访问的环境,只需要改类里的常量配置即可,维护成本极低。
条件化Bean注册实现(改动量稍大)
可以把两个删除接口的代码从原有的Controller中抽离到独立的配置类里,给这个类加上@Profile("dev")注解:
- 只有当前运行环境是dev时,这个配置类才会被Spring容器加载,对应的两个删除端点才会注册到接口映射中
- 非dev环境下,容器里根本不存在这两个删除端点,请求过来直接返回404端点不存在的响应,完全不会触发删除逻辑
这种方式的拦截更彻底,但需要调整原有代码结构,适合接口还在开发初期、尚未正式接入的阶段使用。
网关层统一拦截实现
如果项目部署了统一的API网关,直接在网关侧配置路由拦截规则:对所有发往业务服务的/articles/**的DELETE请求,判断当前网关所属的环境标识,非dev环境直接拦截返回403响应。这种方式不需要在业务代码里加任何逻辑,适合多服务共用同一套环境权限规则的场景。
内容的提问来源于stack exchange,提问作者Rpj
相关产品推荐
相关产品推荐

