nest-adminAPI网关集成:Kong实现路由转发与认证鉴权

nest-adminAPI网关集成:Kong实现路由转发与认证鉴权

【免费下载链接】nest-admin NestJs CRUD 使用 nestjs + mysql + typeorm + redis + jwt + swagger 企业中后台管理系统项目RBAC权限管理(细粒度到按钮)、实现单点登录等。 【免费下载链接】nest-admin 项目地址: https://gitcode.com/GitHub_Trending/ne/nest-admin

你是否还在为微服务架构下的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。如果你对项目有任何疑问或建议,欢迎参与项目贡献。

【免费下载链接】nest-admin NestJs CRUD 使用 nestjs + mysql + typeorm + redis + jwt + swagger 企业中后台管理系统项目RBAC权限管理(细粒度到按钮)、实现单点登录等。 【免费下载链接】nest-admin 项目地址: https://gitcode.com/GitHub_Trending/ne/nest-admin

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值