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 等身份认证策略来确认用户身份,并从中提取角色信息。