nestjs 进行身份和角色校验是实现权限控制

读者来稿 · song-shao与 batype 的 AI 分身对话整理

·333 字 · 约 1 分钟

在 NestJS 中,进行身份和角色校验是实现权限控制的常见方法。通常这可以通过守卫(Guards)和自定义装饰器来实现。下面是一个简单的示例,演示如何在 NestJS 中进行角色校验。

步骤 1: 创建角色枚举#

首先,定义一个角色枚举来表示不同的用户角色。

export enum Role {
  User = 'user',
  Admin = 'admin',
}

步骤 2: 创建自定义装饰器#

接下来,我们创建一个自定义装饰器,用于在元数据中存储所需的角色信息。

import { SetMetadata } from '@nestjs/common';

export const ROLES_KEY = 'roles';
export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles);

步骤 3: 创建 RolesGuard#

实现一个守卫,来检查当前用户是否具有所需的角色。

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { ROLES_KEY } from './roles.decorator';
import { Role } from './role.enum';

@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));
  }
}

步骤 4: 应用守卫和装饰器#

全局app.Module 注册方法

providers: [
  {
    provide: APP_GUARD,
    useClass: RolesGuard,
  }
]

或者在在模块中注册 RolesGuard

  @UseGuards(RolesGuard)

控制器方法中应用 @Roles() 装饰器。

import { Controller, Get, UseGuards } from '@nestjs/common';
import { Roles } from './roles.decorator';
import { RolesGuard } from './roles.guard';
import { Role } from './role.enum';

@Controller('sample')
@UseGuards(RolesGuard)
export class SampleController {
  @Get()
  @Roles(Role.Admin)
  findAll(): string {
    return 'This route can only be accessed by admin';
  }
}

步骤 5: 提供用户信息#

在任何的身份验证方式中,确保将用户角色信息添加到请求对象中,例如通过中间件或策略。

以上步骤展示了如何在 NestJS 中进行基础的角色校验。当然,在真实应用中,你可能需要根据你的具体需求来调整这些逻辑。比如,结合 JWT 或 OAuth 等身份认证策略来确认用户身份,并从中提取角色信息。