【发布时间】:2020-09-02 05:26:52
【问题描述】:
我有 ADMIN、SUPERADMIN、USER、MODERATORS 的角色守卫,
这是其中一名守卫的示例。案件中的一名管理员警卫。他们正在按我的预期工作,但我无法在控制器中添加多个警卫
import { Injectable, CanActivate, ExecutionContext, HttpException, HttpStatus } from '@nestjs/common';
@/Injectable()
export class AdminGuard implements CanActivate {
constructor() { }
canActivate(context: ExecutionContext) {
const request = context.switchToHttp().getRequest();
const user = request.user;
if (user.usertype == 'Admin') {
return true;
}
throw new HttpException('Unauthorized access', HttpStatus.BAD_REQUEST);
}
}
在我的控制器中,我有这个装饰器
@UseGuards(AuthGuard('jwt'), AdminGuard)
我希望能够做这样的事情
@UseGuards(AuthGuard('jwt'), AdminGuard, SuperAdminGuard)
或
@UseGuards(AuthGuard('jwt'), [AdminGuard, SuperAdminGuard, UserGuard])
或
@UseGuards(AuthGuard('jwt'), AdminGuard || SuperAdminGuard || UserGuard])
上述实现均无效。有没有更好的方法来解决它?也许有些事情我做的不对。我已经检查了文档,但我似乎无法使其工作
【问题讨论】:
-
在
@UseGuards(A, B, C)中,如果A返回false,则不会转到B。所以为了继续,所有都必须返回true。您可能希望这样处理:if (user.usertype === 'Admin' || user.usertype) { return true },以便可以调用下一个守卫。 -
您的建议奏效了。我试了一下。但我会选择@kim-kern
标签: angular typescript nestjs roles guard