NestJS 若依同款演示模式实现

在开发后台管理系统时,我们经常需要为演示环境添加操作限制,防止访客随意修改数据。本文将介绍如何在 NestJS 中实现类似若依框架的演示环境守卫。

核心实现

1、创建演示环境守卫

demo-environment.guard.ts

typescript 复制代码
// src\common\guard\demo-environment.guard.ts

import { ConfigService } from '@nestjs/config'
import { BusinessException } from '../exception/business.exception'
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'

/**
 * 演示环境操作守卫
 * @description 用于限制演示环境的操作权限:
 * 1. 非演示环境:直接放行所有请求
 * 2. 演示环境:仅允许 GET 请求 + 白名单内的非GET请求,其他请求直接抛出异常
 */
@Injectable()
export class DemoEnvironmentGuard implements CanActivate {
  constructor(private readonly configService: ConfigService) {}

  /**
   * 守卫核心方法:判断请求是否允许执行
   * @param context 执行上下文(可获取请求/响应信息)
   * @returns 允许返回true,拒绝则抛出业务异常
   */
  async canActivate(context: ExecutionContext): Promise<boolean> {
    // 1. 从配置中获取是否为演示环境,默认值:非演示环境
    const isDemoEnvironment = this.configService.get('server.isDemo', false)
    // 2. 非演示环境 → 直接放行所有请求
    if (!isDemoEnvironment) return true
    // 3. 演示环境 → 获取 HTTP 请求对象
    const request = context.switchToHttp().getRequest<ExpressRequest>()
    const requestMethod = request.method.toUpperCase()
    // 4. 演示环境放行白名单(支持登录/登出等基础接口)
    const whiteList = ['/login', '/logout']
    // 5. 判断当前请求路径是否在白名单中
    const isWhite = whiteList.some((item) => request.originalUrl.includes(item))
    // 6. 演示环境拦截规则:非 GET 请求 + 不在白名单 → 拒绝访问
    if (requestMethod !== 'GET' && !isWhite) throw new BusinessException('演示环境,不允许操作')
    // 7. 符合规则 → 放行
    return true
  }
}

2. 全局注册守卫

typescript 复制代码
// src\app.module.ts

import { APP_GUARD } from '@nestjs/core'
import { DemoEnvironmentGuard } from '@/common'

@Module({
  providers: [
    // 是否演示环境守卫
    { provide: APP_GUARD, useClass: DemoEnvironmentGuard },
  ]
})

3. 配置文件示例

yaml 复制代码
# config\config.yaml
server:
  isDemo: true  # 开启演示模式

工作原理

  • 环境判断 :通过 configService 读取配置,判断当前是否为演示环境
  • 请求拦截:演示环境下,所有非 GET 请求(除白名单外)都会被拦截
  • 友好提示:拦截时抛出业务异常,前端可捕获并提示用户

使用效果

  • 开发/生产环境:所有请求正常放行,不受限制
  • 演示环境
    • ✅ GET 请求正常访问
    • /login/logout 等白名单接口正常访问
    • ❌ 其他 POST/PUT/DELETE 请求被拦截,返回「演示环境,不允许操作」

总结

通过实现 CanActivate 接口,我们仅用 30 行代码就完成了演示环境守卫的开发。这种实现方式简洁高效,完美复刻了若依框架的演示模式功能,非常适合在开源项目或在线体验系统中使用。

相关推荐
copyer_xyf16 小时前
PostgreSQL 做向量检索:一条单库路线
数据库·agent·nestjs
Revolution6116 小时前
Nest.js 是什么:怎样用它写出第一个后端接口
后端·node.js·nestjs
濮水大叔3 天前
NestJS 与 CabloyJS 的 env/config 架构对比:从环境变量到实例级配置
前端·node.js·nestjs
Allshadow8 天前
Nest.js - 连接数据库
javascript·nestjs
Allshadow11 天前
Nest.js - 目录结构
javascript·nestjs
南一Nanyi11 天前
依赖注入和控制反转
前端·设计模式·nestjs
晓得迷路了13 天前
栗子前端技术周刊第 138 期 - NestJS 12、Astro 7.1、npm 12...
前端·javascript·nestjs
xiaofeichaichai15 天前
NestJS 实战:JWT 登录认证、Token 刷新与安全退出
redis·nestjs·jwt·twitter
无双_Joney16 天前
[四期 - 4] NestJS专栏 - 征召一下大家的意见,非常想知道大家都想看看Nest的哪些方面
前端·后端·nestjs
糖墨夕18 天前
AI Agent技术栈选择:Vue3 + NestJS + TypeScript 为什么是绝佳组合
前端·nestjs