برنامه نویسی

نحوه اجرای احراز هویت با nestjs با استفاده از گاردها در 3 مرحله آسان

در حال حاضر بسیاری از شرکت‌ها دیدگاه خود را برای انجام یک اپلیکیشن تغییر داده‌اند، فریم‌ورک‌ها و کتابخانه‌های زیادی به‌روز شده‌اند، شکل توسعه را تغییر داده‌اند و پیاده‌سازی آن‌ها، راه‌حل‌هایی برای پیچیده واقعیت مسئله را انجام داده‌اند. امروز، کمی در مورد nestjs می گوییم، این یک فریم ورک پیشرو برای بک اند با جاوا اسکریپت است، که از طریق آن می توان برنامه های مقیاس پذیر را با حالت تمیز و سفارشی ایجاد کرد.

بنابراین، اما، درباره چه موضوعاتی صحبت خواهیم کرد؟ بیایید در مورد Guards در Nestjs صحبت کنیم، ابزاری چند رشته‌ای که اجازه می‌دهد هر منطقی را قبل از رسیدن درخواست به کنترل‌کننده‌های ما پیاده‌سازی کند.

مفاهیم رسمی کلاسی است که با آن مشروح شده است @Injectable() دکوراتور که CanActivate interfaceGuard را پیاده سازی می کند یک مسئولیت دارد. آنها بسته به شرایط خاصی (مانند مجوزها، نقش‌ها، ACLها و غیره) که در زمان اجرا وجود دارند، تعیین می‌کنند که آیا یک درخواست داده شده توسط هدایتگر مسیر رسیدگی می‌شود یا خیر. این اغلب به عنوان مجوز نامیده می شود. مجوز (و پسر عموی آن، احراز هویت، که معمولاً با آن همکاری می‌کند) معمولاً توسط میان‌افزار در برنامه‌های سنتی Express اداره می‌شود. میان‌افزار انتخاب خوبی برای احراز هویت است، زیرا مواردی مانند اعتبار سنجی توکن و پیوست کردن ویژگی‌ها به شی درخواست به شدت با یک زمینه مسیر خاص (و ابرداده‌های آن) مرتبط نیستند.

در این وبلاگ در مورد تمام کارهایی که با این عملکرد می توان انجام داد صحبت نکنید، به طور مشخص نگاه کنید که چگونه یک محافظ برای احراز هویت بدون نصب هیچ چیز و به شکل آسان پیاده سازی می کند. بیا بریم

مرحله صفر:

ما باید یک پروژه Nestjs را در رایانه هایمان ایجاد کنیم، برای انجام این کار، بررسی، همچنین مهم است، باید یک ماژول با هر عملکردی ایجاد کنید، در غیر این صورت باید یک ماژول با:

npm g module Foo

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


و مرحله کامل با بعدی و انجام شد!


گام اول:

اولین کاری که باید انجام دهیم این است که یک محافظ ایجاد کنیم، برای این کار از دستور استفاده می کنیم:

nest generate gu FooGuard

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


این دستور چیزی شبیه به زیر ایجاد می کند:

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

@Injectable()
export class FooGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    return true;
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


ما به یاد داریم که این گارد یک رابط CanActivate را پیاده سازی می کند، یعنی کسی که تمام منطق گارد ما را مدیریت می کند.

خوب، پس از ایجاد دکوراتور خود، بسیار مهم است، زیرا این امر با تزریق وابستگی، به محافظ ما تماس می گیرد

import { SetMetadata } from '@nestjs/common';
import { FooEnum } from './FooEnum.enum';

export const FooRolesDecorator = (...fooRolesDecorator: FooRolesDecorator[]) =>
  SetMetadata('fooRolesDecorator', FooEnum);

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


**مهم: **ضروری نیست Enum ایجاد کنید، اما توسط nestjs بسیار توصیه می شود، برای بهترین شیوه ها، اطلاعات بیشتر: https://docs.nestjs.com/openapi/types-and-parameters#enums


مرحله دوم:

پس از ایجاد یک فایل نگهبان و دکوراتور آن، به پیاده سازی می رویم، زیرا این بسیار مهم است که شما در مورد درایو تزریق وابستگی دانش داشته باشید. برای اکوسیستم های درایو با تزریق وابسته، nestjs، یک رابط آماده برای استفاده فراهم کنید. ExecutionContext، اساساً این کار را برای توصیف جزئیات مربوط به خط لوله درخواست فعلی و بازگشت دو روش انجام دهید. getClass()، که نوع کلاس کنترلی را که کنترل کننده فعلی به آن تعلق دارد، برمی گرداند getHandler() که مرجعی را به handler (روش) برمی‌گرداند که در مرحله بعدی فراخوانی می‌شود
درخواست خط لوله برای اطلاعات بیشتر: https://docs.nestjs.com/guards#execution-context

بنابراین، پس از درک این مفهوم، استفاده از این کلاس، این است که یک پارامتر، که نقش ما خواهد بود.

@Injectable()
export class FooGuard implements CanActivate {
  constructor(
    private reflector: Reflector,
    @Inject('MY_REPO_IN_MODULE')
    private myRepoInModule: Repository<MiModel>,
  ) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const role = this.reflector.getAllAndOverride<
      FooRolesDecorator[]
    >('fooRolesDecorator ', [context.getHandler(), context.getClass()]);

    if (!role ) {
      return false;
    }

    const request = context.switchToHttp().getRequest();
    const user = request.headers['user-id'];


    if (!user) {
      throw new HttpException(
        {
          status: 403,
          error: `Do not have authorization`,
        },
        403,
      );
    }

    const roleUser = await this.myRepoInModule.findOne({
      where: {user_id: user.userId});

    if (!reqUser) {
      throw new HttpException(
        {
          status: 403,
          error: `Do not have authorization`,
        },
        403,
      );
    }
  }
    return true;
  }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


  • اشاره: بازتابنده helper برای بازیابی متادیتا برای یک کلید مشخص برای یک هدف مشخص استفاده می کند. چند کلمه، داده هایی را دریافت کنید که در دکوراتور ما تنظیم شده است.

  • اشاره: روش، getRequest() برای اجازه دادن، به دست آوردن درخواست شی، از متن.

  • اشاره: گاردها (مخزن‌ها، موجودیت‌ها) را از ماژول‌هایی که در آنجا فراخوانی شده‌اند، به‌طور خودکار می‌گیرند.


مرحله سوم:

در این مرحله آخر، برای پیاده سازی در هر کنترلر (ترجیحا)، در برنامه شما.

@Controller('api/foo')
@UseGuards(FooGuard)
export class RolesController {
  constructor(private readonly rolesService: RolesService) {}

  @Get()
  @FooRolesDecorator(MyEnum.Admin || 'Admin')
  create(@Body() createRoleDto: CreateRoleDto) {
    return this.rolesService.create(createRoleDto);
  }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


  • اشاره: @UseGuards() دکوراتور که محافظ ها را بسته به زمینه آن به محدوده کنترل کننده یا روش متصل می کند. چه زمانی @UseGuards در سطح کنترل‌کننده استفاده می‌شود، محافظ برای هر کنترل‌کننده (روش) در کنترل‌کننده اعمال می‌شود.

  • اشاره: دکوراتور، @FooRolesDecorator() اجازه می دهد تا از طریق تزریق وابستگی، تنظیم شده بر روی پارامتر، اعتبار مجوز مورد نیاز خود را تأیید کند.

انجام شده!!

نگهبان با لانه 3 مرحله آسان …

فراموش نکنید که در شبکه های اجتماعی من دنبال کنید:

@brngranado در اینستاگرام
@brngranado در توییتر
@GranadoLab در Github

آنجا میبینمت !

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا