AccessControl؛ کنترل دسترسی جدی برای Node.js
خلاصهٔ کاملتر
AccessControl یه کتابخونهٔ کنترل دسترسی برای Node.jsه با API زنجیرهای و یه موتور سیاست واقعی زیرش. ایدهٔ اصلیش اینه که دو مدل کلاسیک رو کنار هم بیاره: کنترل دسترسی مبتنی بر نقش با ارثبری سلسلهمراتبی و منطق deny-overrides، در کنار قواعد مبتنی بر ویژگی. نسخهٔ ۳ همین ترکیب رو با چند قابلیت عملیاتی کامل کرده.
مهمترین بخش، مالکیت و گروهبندیه. با تنظیم یکبارهٔ ownerField یا owner، حالت own واقعاً بررسی میکنه که رکورد مال درخواستدهنده هست یا نه، نه اینکه فقط فرضش رو بگیره. دسترسی رو میشه به گروه نقشها و دستههای منابع داد تا مجوزهای انبوه ولی محدود ساخته بشه. فراتر از CRUD هم با .action() و .do() میشه اکشن دلخواه تعریف کرد، و require() گیتهایی اضافه میکنه که فقط میتونن دسترسی رو محدودتر کنن، نه بازتر.
شرطها با .where() نوشته میشن: مقایسه، in، cidr و بازههای زمانی، به شکل رشته یا JSON؛ منطق سفارشی و ناهمگام هم از راه grantedAsync حل میشه. از نظر سختسازی، tryCan() هیچوقت استثنا پرت نمیکنه، نامها در برابر prototype pollution امنان، regex اختیاریه و در برابر ReDoS محافظت میشه، و خطاها با جزئیات حذفشده ولی همراه err.code برمیگردن. تیم پروژه از پوشش تست ۱۰۰٪، تست جهش و فازینگ میگه.
برای ممیزی هم روی هر تصمیم یه رویداد access منتشر میشه — چه دسترسی داده بشه چه رد بشه، همراه با reason — و هوکهای change و error هم برای ثبت کامل تغییرات و خطاها وجود دارن. یه اینتگریشن رسمی NestJS به اسم nestjs-accesscontrol هم داره که دکوریتورهای CRUD، یه گارد fail-closed و گرنتهای خوندهشده از دیتابیس با forRootAsync رو میده.
نکات کلیدی:
- RBAC با ارثبری سلسلهمراتبی و deny-overrides، بهعلاوهٔ قواعد ABAC، تو یه موتور
- own مالکیت رکورد رو واقعاً چک میکنه؛ کافیه یه بار ownerField رو تنظیم کنی
- .action() و .do() برای اکشنهای خارج از CRUD و require() برای گیتهای اجباری
- .where() برای شرطهای مقایسهای، in، cidr و بازهٔ زمانی؛ grantedAsync برای منطق ناهمگام
- رفتار fail-closed: tryCan() استثنا پرت نمیکنه و خطاها با err.code برمیگردن
- رویداد access روی هر تصمیم، همراه با reason، مسیر ممیزی رو کامل میکنه
- اینتگریشن رسمی NestJS با گارد fail-closed و فیلتر ویژگیها در خروجی




