NestJs カスタム デコレータ

(たとえ行動が間違いにつながるとしても、それは学習と成長にもつながります。行動しないことは停滞と萎縮につながります。)

ここに画像の説明を挿入

NestJs カスタム デコレータ

アプリケーションシナリオ

カスタム デコレータを使用してインターフェイスの権限を確認する

制御層

このうち、getHelloAll インターフェイスには admin または getData 権限が必要で、
getHello インターフェイスには admin、getData、または dev 権限が必要です。

import {
    
     Controller, Get, Query } from '@nestjs/common';
import {
    
     AppService } from './app.service';
import {
    
     Role } from './user.decorator';

@Controller()
export class AppController {
    
    
  constructor(private readonly appService: AppService) {
    
     }

  @Get('getHelloAll')
  getHelloAll (@Role(['admin', 'getData']) @Query() query: any): string {
    
    
    console.log(query);
    return this.appService.getHello();
  }

  @Get('getHello')
  getHello (@Role(['admin', 'getData', 'dev']) @Query() query: any): string {
    
    
    console.log(query);
    return this.appService.getHello();
  }

}

カスタムデコレータ

import {
    
     createParamDecorator, ExecutionContext, HttpException } from '@nestjs/common';

/**
 * 接口权限校验装饰器
 * role 该装饰器入参,接口的角色参数
 * ctx 装饰器的上下文,包含请求体等信息
 */
export const Role = createParamDecorator((roleList: string[], ctx: ExecutionContext) => {
    
    
  const request = ctx.switchToHttp().getRequest();
  // get请求参数默认挂载在query上
  const queryParam = request.query;
  // 这里获取用户token
  const userToken = queryParam.token;
  // TODO 需要从缓存或数据库中读取用户数据,得到用户所属权限
  // 假设这是获取到的用户数据,角色为dev开发者
  const userData = {
    
    
    role: 'dev',
  };
  // 对比用户角色是否一致,不一致则抛出403
  if (!roleList.includes(userData.role)) {
    
    
    throw new HttpException('权限不足', 403);
  }
  return queryParam
});

このとき、getHelloAll にアクセスすると、権限が不足している旨のメッセージが表示され、getHello にアクセスするとインターフェイスは正常に動作します。

おすすめ

転載: blog.csdn.net/qq_42427109/article/details/130893514