(たとえ行動が間違いにつながるとしても、それは学習と成長にもつながります。行動しないことは停滞と萎縮につながります。)
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 にアクセスするとインターフェイスは正常に動作します。