Skip to content

基于 RBAC 的授权

ts
import { SetMetadata } from "@nestjs/common";

// 角色定义
export enum Role {
  User = "user",
  Admin = "admin",
}

// 元数据定义
export const ROLES_KEY = "roles";
export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles);
ts

// 在控制器中, 给路由处理函数附加元数据
@Controller('person')
export class PersonController() {
  @Roles(Role.Admin) 
  @UseGuards(AuthGuard, RolesGuard) // 用户登录守卫, 角色权限守卫
  @Post('create')
  create() {
    // logic...
    // 经过路由守卫后, 当前用户具有要求的角色, 执行路由逻辑
  }
}
ts
@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {}

  canActivate(context: ExecutionContext): boolean {
    /**
     * describe: 通过 reflector 来获取路由处理函数或者控制器 Class 上附加的元数据
     * 有针对性的对于某些路由处理函数进行覆盖: 使用 getAllAndOverride
     * 如果需要合并: 使用 getAllAndMerge
     * 如果只是简单的读取: 使用 get
     */
    const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
      context.getHandler(),
      context.getClass(),
    ]);

    // logic...
    // 检查当前用户是否符合角色, 进行拦截或放行
  }
}
2025( )
今日 8.33%
本周 42.86%
本月 48.39%
本年 4.11%
Powered by Snowinlu | Copyright © 2024- | MIT License