nest-adminAPI网关集成:Kong实现路由转发与认证鉴权
你是否还在为微服务架构下的API管理而烦恼?路由混乱、认证复杂、权限难以控制?本文将带你一步步实现nest-admin与Kong网关的无缝集成,解决这些痛点。读完本文,你将掌握如何使用Kong实现API路由转发、统一认证鉴权,以及与nest-admin的RBAC权限系统结合,让你的API管理更加高效、安全。
为什么选择Kong网关
在微服务架构中,API网关扮演着至关重要的角色。它可以实现请求路由、负载均衡、认证鉴权、限流熔断等功能,是微服务架构的流量入口。Kong作为一款高性能、可扩展的云原生API网关,具有以下优势:
- 基于Nginx,性能优异,能够处理高并发请求
- 插件化架构,支持丰富的功能扩展
- 支持动态配置,无需重启服务即可生效
- 提供RESTful API和Admin UI,便于管理和监控
环境准备
在开始集成之前,我们需要准备以下环境:
- Docker和Docker Compose:用于部署Kong和相关服务
- nest-admin项目:本文使用的项目路径为GitHub_Trending/ne/nest-admin
- MySQL、Redis:nest-admin项目依赖的数据库和缓存服务
部署Kong网关
首先,我们使用Docker Compose部署Kong网关。创建docker-compose.kong.yml文件,内容如下:
version: '3'
services:
kong-database:
image: postgres:13
environment:
POSTGRES_USER: kong
POSTGRES_DB: kong
POSTGRES_PASSWORD: kong
volumes:
- kong-data:/var/lib/postgresql/data
kong-migrations:
image: kong:latest
command: kong migrations bootstrap
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-database
KONG_PG_USER: kong
KONG_PG_PASSWORD: kong
KONG_PG_DATABASE: kong
depends_on:
- kong-database
kong:
image: kong:latest
ports:
- "8000:8000" # HTTP流量端口
- "8443:8443" # HTTPS流量端口
- "8001:8001" # Admin API端口
- "8444:8444" # Admin API HTTPS端口
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-database
KONG_PG_USER: kong
KONG_PG_PASSWORD: kong
KONG_PG_DATABASE: kong
KONG_PROXY_ACCESS_LOG: /dev/stdout
KONG_ADMIN_ACCESS_LOG: /dev/stdout
KONG_PROXY_ERROR_LOG: /dev/stderr
KONG_ADMIN_ERROR_LOG: /dev/stderr
KONG_ADMIN_LISTEN: 0.0.0.0:8001, 0.0.0.0:8444 ssl
depends_on:
- kong-database
- kong-migrations
volumes:
kong-data:
配置Kong路由转发
创建Service
使用Kong Admin API创建一个指向nest-admin服务的Service:
curl -X POST http://localhost:8001/services \
--data "name=nest-admin-service" \
--data "url=http://nest-admin:3000"
其中,nest-admin是nest-admin服务在Docker网络中的服务名,3000是nest-admin的默认端口。
创建Route
为Service创建Route,实现API路由转发:
curl -X POST http://localhost:8001/services/nest-admin-service/routes \
--data "name=nest-admin-route" \
--data "paths[]=/api" \
--data "methods[]=GET" \
--data "methods[]=POST" \
--data "methods[]=PUT" \
--data "methods[]=DELETE"
这样,所有以/api开头的请求都会被Kong转发到nest-admin服务。
集成认证鉴权
nest-admin使用JWT进行认证,我们需要在Kong中集成JWT插件,实现统一的认证鉴权。
启用JWT插件
为nest-admin-service启用JWT插件:
curl -X POST http://localhost:8001/services/nest-admin-service/plugins \
--data "name=jwt" \
--data "config.secret_is_base64=false" \
--data "config.key_claim_name=iss" \
--data "config.claims_to_verify=exp"
配置JWT密钥
在nest-admin中,JWT密钥配置在src/config/security.config.ts文件中:
export default () => ({
security: {
jwt: {
secret: process.env.JWT_SECRET || 'your-secret-key',
expiresIn: process.env.JWT_EXPIRES_IN || '1d',
},
},
});
将该密钥配置到Kong中:
curl -X POST http://localhost:8001/consumers \
--data "username=nest-admin-consumer"
curl -X POST http://localhost:8001/consumers/nest-admin-consumer/jwt \
--data "key=nest-admin-key" \
--data "secret=your-secret-key"
RBAC权限集成
nest-admin实现了细粒度到按钮的RBAC权限管理,相关代码在src/modules/auth/guards/rbac.guard.ts。我们需要将Kong的认证结果与nest-admin的RBAC权限系统结合。
传递用户信息
配置Kong将JWT解析后的用户信息传递给nest-admin:
curl -X PATCH http://localhost:8001/plugins/{plugin-id} \
--data "config.claims_to_headers[user_id]=sub" \
--data "config.claims_to_headers[username]=username"
在nest-admin中获取用户信息
在nest-admin的控制器中,使用src/modules/auth/decorators/auth-user.decorator.ts装饰器获取用户信息:
import { AuthUser } from './decorators/auth-user.decorator';
@Controller('users')
export class UserController {
@Get()
@UseGuards(JwtAuthGuard, RbacGuard)
@Permission('user:list')
findAll(@AuthUser() user) {
return this.userService.findAll(user);
}
}
测试与验证
测试路由转发
发送请求到Kong的代理端口,验证路由转发是否生效:
curl http://localhost:8000/api/users
测试认证鉴权
不携带JWT令牌发送请求,应返回401 Unauthorized:
curl http://localhost:8000/api/users
携带有效的JWT令牌发送请求,应返回正常结果:
curl http://localhost:8000/api/users \
-H "Authorization: Bearer {your-jwt-token}"
测试RBAC权限
使用没有user:list权限的用户令牌发送请求,应返回403 Forbidden:
curl http://localhost:8000/api/users \
-H "Authorization: Bearer {unauthorized-jwt-token}"
总结与展望
通过本文的步骤,我们成功实现了nest-admin与Kong网关的集成,实现了API路由转发、统一认证鉴权,以及与RBAC权限系统的结合。未来,我们可以进一步扩展Kong的功能,如添加限流、监控插件,提升API的可用性和安全性。
nest-admin项目提供了完善的企业中后台管理系统功能,更多详情请参考README.md。如果你对项目有任何疑问或建议,欢迎参与项目贡献。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



