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时接口正常运行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值