如果不是管理员,我会尝试阻止某些 root,但是当我运行代码时,我有一个 TypeError 但我不知道如何解决它。
谢谢
roles.guards.ts
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { Role } from './role.enums';
import { ROLES_KEY } from './roles.decorator';
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
context.getHandler(),
context.getClass(),
]);
if (!requiredRoles) {
return true;
}
const { user } = context.switchToHttp().getRequest();
return requiredRoles.some((Role) => user.roles?.includes(Role));
}
}
articles.controllers.ts
@UseGuards(JwtAuthGuard)
@Roles(Role.Admin)
async addArticle(
@Body('title') artTitle: string,
@Body('description') artDescription: string,
@Body('url') artUrl: string,
@Body('cover') artCover: string,
@Body('content') artContent: string,
@Body('category') artCategory: string,
){
const generatedId = await this.articlesService.insertArticle(
artTitle,
artDescription,
artUrl,
artCover,
artContent,
artCategory
);
return { id: generatedId };
}
当我运行代码时,我有一个 TypeError 但我不知道如何解决它。
谢谢
答案 0 :(得分:3)
如果我敢打赌,您的 RolesGuard
绑定到全局范围,而 JwtAuthGuard
绑定到路由处理程序范围。全局守卫首先执行,因此 RolesGuard
在 JwtAuthGaurd
可以设置 req.user
之前执行(passport 就是在幕后执行此操作)。您可以做的是确保有一个 req.user
属性(通过中间件或全局运行 JwtAuthGuard
的 jutt),或者您可以将 RolesGuard
移动到路由处理程序的范围内 JwtAuthGuard
运行之后的级别。
答案 1 :(得分:0)
在控制器上方使用@Post()
@UseGuards(JwtAuthGuard)
@Roles(Role.Admin)
@Post('')
async addArticle(
@Body('title') artTitle: string,
@Body('description') artDescription: string,
@Body('url') artUrl: string,
@Body('cover') artCover: string,
@Body('content') artContent: string,
@Body('category') artCategory: string,
){
const generatedId = await this.articlesService.insertArticle(
artTitle,
artDescription,
artUrl,
artCover,
artContent,
artCategory
);
return { id: generatedId };
}