(即使行动导致错误,却也带来了学习与成长;不行动则是停滞与萎缩。)
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时接口正常运行。