在控制器中添加多个Nestjs RoleGuards,可以通过以下步骤实现:
import { Controller, Get, UseGuards } from '@nestjs/common';
import { Roles } from './roles.decorator';
import { RoleGuard } from './role.guard';
Roles
,用于标记需要的角色:export const Roles = (...roles: string[]) => SetMetadata('roles', roles);
RoleGuard
,用于验证角色:import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
@Injectable()
export class RoleGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const requiredRoles = this.reflector.get<string[]>('roles', context.getHandler());
if (!requiredRoles) {
return true; // 如果没有标记角色,则允许访问
}
const request = context.switchToHttp().getRequest();
const user = request.user; // 假设已经通过身份验证并将用户信息存储在请求中
// 检查用户是否具有所需的角色
const hasRequiredRole = requiredRoles.some(role => user.roles.includes(role));
return hasRequiredRole;
}
}
UseGuards
装饰器和自定义的守卫RoleGuard
,并使用Roles
装饰器标记需要的角色:@Controller('example')
export class ExampleController {
@Get()
@UseGuards(RoleGuard)
@Roles('admin', 'user') // 标记需要的角色
async exampleRoute() {
// 处理路由逻辑
}
}
这样,当访问/example
路由时,RoleGuard
守卫会验证用户是否具有admin
或user
角色。如果用户具有其中一个角色,则允许访问,否则将返回未授权的错误。
推荐的腾讯云相关产品:腾讯云云服务器(CVM)、腾讯云容器服务(TKE)、腾讯云函数计算(SCF)等。你可以在腾讯云官网上找到这些产品的详细介绍和文档。
请注意,以上答案仅供参考,具体实现可能因个人需求和项目配置而有所不同。
领取专属 10元无门槛券
手把手带您无忧上云