برنامه نویسی
کنترل دسترسی مبتنی بر نقش پیشرفته (RBAC) در Nestjs با یک نگهبان مجوز سفارشی

اجرای کنترل دسترسی مبتنی بر نقش در برنامه Nestjs شما؟ در اینجا یک راه حل تمیز و مقیاس پذیر با استفاده از یک محافظ مجوز سفارشی وجود دارد که:
✅ از مسیرهای public () پشتیبانی می کند
✅ مجوزها را از طریق دکوراتور PERMISSION () بررسی می کند
✅ به Super_admin اجازه می دهد تا همه چک ها را دور بزند
✅ از دسترسی Wildcard مانند کاربر پشتیبانی می کند:*
🔐 مثال:
@Permission('user:create')
@Post('create')
createUser() { ... }
در کنترل کننده ها چک های کثیف دیگری وجود ندارد! این نگهبان همه چیز را به طور مرتب و کارآمد در سطح مسیر انجام می دهد.
code کد نگهبان مجوز
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { IS_PUBLIC_KEY } from 'src/decorators/public.decorator';
import { PERMISSION_KEY } from 'src/decorators/Permission.decorator';
import { JwtPayload } from 'jsonwebtoken';
import { AdministratorRoleEnum } from '@prisma/client';
@Injectable()
export class PermissionGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const isPublic = this.reflector.get(
IS_PUBLIC_KEY,
context.getHandler(),
);
if (isPublic) return true;
const requiredRules = this.reflector.get(
PERMISSION_KEY,
context.getHandler(),
);
if (!requiredRules || requiredRules.length === 0) return true;
const request = context.switchToHttp().getRequest();
const user = request.user as JwtPayload;
if (!user) return false;
if (user.role === AdministratorRoleEnum.super_admin) return true;
if (!Array.isArray(user.rules)) return false;
return requiredRules.every((requiredRule) => {
if (user.rules.includes(requiredRule)) return true;
const resource = requiredRule.split(':')?.[0];
return user.rules.includes(`${resource}:*`);
});
}
}
ایده آل برای پانل های سرپرست ، داشبورد یا هر برنامه ای با چندین نقش کاربر. 💼
👉 RBAC تمیز ، مقیاس پذیر و آماده تولید در Nestjs.
برای مطالعه بیشتر اینجا را کلیک کنید
با احترام ،
NI Rimon