返回

走过八百里,用你理解的Nestjs接口权限控制

前端

正文

在现代web开发中,接口权限控制是必不可少的。Nestjs,一个流行的Node.js框架,提供了强大的工具来实现接口权限控制。我们将在这个指南中使用经典的RBAC权限模型来实现它。

  1. 创建Guard

第一步是创建一个Guard,它将负责检查请求的权限。在Nestjs中,可以使用@CanActivate()装饰器来创建Guard。例如:

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    const user = request.user;

    return user.hasPermission('view_profile');
  }
}

在上面的示例中,AuthGuard检查请求的用户是否具有“view_profile”权限。如果用户具有此权限,则Guard将返回true,并且请求将被允许继续。否则,Guard将返回false,并且请求将被拒绝。

  1. 使用中间件

一旦创建了Guard,就可以将其应用于控制器或路由。可以使用@UseGuards()装饰器来实现。例如:

import { Controller, UseGuards, Get } from '@nestjs/common';
import { AuthGuard } from './auth.guard';

@Controller('profile')
@UseGuards(AuthGuard)
export class ProfileController {
  @Get()
  getProfile() {
    // 获取当前登录用户的档案
  }
}

在上面的示例中,@UseGuards()装饰器应用于ProfileController。这意味着所有对ProfileController的请求都会经过AuthGuard。如果请求的用户没有“view_profile”权限,那么请求将被拒绝。

  1. 缓存权限信息

为了提高性能,可以将权限信息缓存到Redis中。这可以使用定时任务来实现。例如:

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

@Injectable()
export class CacheService {
  private cache: Record<string, string[]> = {};

  constructor() {
    // 初始化缓存定时任务
  }

  getPermissions(userId: string): string[] {
    return this.cache[userId] || [];
  }

  setPermissions(userId: string, permissions: string[]) {
    this.cache[userId] = permissions;
  }
}

在上面的示例中,CacheService实现了简单的缓存机制。它提供了一个getPermissions()方法来获取用户的权限,以及一个setPermissions()方法来设置用户的权限。

  1. 在守卫中使用缓存

最后,可以在守卫中使用缓存来提高性能。例如:

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { CacheService } from './cache.service';

@Injectable()
export class AuthGuard implements CanActivate {
  constructor(private cacheService: CacheService) {}

  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    const user = request.user;

    const permissions = this.cacheService.getPermissions(user.id);

    return permissions.includes('view_profile');
  }
}

在上面的示例中,AuthGuard使用CacheService来获取用户的权限。这可以提高性能,因为权限信息已经缓存到Redis中。

  1. 总结

在本文中,我们指导您在Nestjs中实现完整的接口权限控制。我们使用经典的RBAC权限模型,并使用定时任务将权限信息缓存到Redis中。然后,我们使用中间件和守卫来实现接口权限控制。通过这种方式,我们可以确保只有具有适当权限的用户才能访问我们的接口。