معرفی¶
django-clearance در یک پروژهی Django تصمیم میگیرد چه کسی چه کاری میتواند بکند - و روی کدام ردیفها، و با کدام فیلدها. دسترسی را مدیر سیستم در پنل ادمین Django و بدون نوشتن کد میدهد؛ کد فقط چیزی را میگوید که گفتنش کار پروژه است: مجوزهایی که یک مدل دارد، و دامنههایی که ردیفهایش با آنها در دسترس قرار میگیرند.
مسئلهای که حل میکند¶
مجوزهای Django به یک پرسش جواب میدهند: آیا این شخص میتواند سفارشها را تغییر دهد؟ یک پروژهی واقعی سه پرسش دیگر هم دارد، و Django جواب هر کدام را به viewها میسپارد:
- کدام سفارشها؟ مدیر یک شعبه سفارشهای شعبهی خودش را تغییر میدهد، نه همهی شعبهها را. یک مشتری سفارشهای خودش را میخواند.
- کدام فیلدها؟ مدیر سفارش را میخواند، اما مبلغی را که فروشگاه گرفته نه.
- کدام مقدارها؟ هر کسی که بتواند سفارشی را ویرایش کند، میتواند کالای آن را اصلاح کند - اما فقط کسی که اجازهی تأیید دارد آن را تأییدشده میکند.
اگر این جوابها در viewها نوشته شوند، هر کدام در هر view، در API، در پنل ادمین و در هر خروجی دوباره نوشته میشود - و آن یکی که فراموش شود سفارشهای همهی مشتریها را به همه نشان میدهد، بی آنکه چیزی خطا بدهد. django-clearance به هر کدام یک بار، در یک جا، جواب میدهد و همهی درها از همان میپرسند.
چهار لایه¶
| لایه | پرسش | کجا تصمیم گرفته میشود |
|---|---|---|
| بستهها | این شخص چه مجوزهایی دارد؟ | پنل ادمین، یا یک فایل |
| دامنههای ردیف | یک مجوز به کدام ردیفها میرسد؟ | دامنهای که کنار هر مجوز انتخاب میشود |
| فیلدهای محافظتشده | کدام فیلدها را میتواند بخواند، و بنویسد؟ | دو مجوزِ خود آن فیلد |
| نقشها، اختیاری | این شخص چه چیزی را هیچوقت نمیتواند داشته باشد؟ | سقف یک نقش |
هر لایه بدون لایهی بعدی هم کار میکند. یک پروژه میتواند با بستهها و دامنهها شروع کند و فیلدهای محافظتشده را روزی اضافه کند که لازمشان دارد.
پیشفرض، رد کردن است¶
- هیچ کس چیزی را که به او داده نشده ندارد.
- یک مجوز تا وقتی دامنهای نگوید به کدام ردیفها میرسد، به هیچ ردیفی نمیرسد.
- فیلدی که محافظتشده علامت خورده، کنار گذاشته میشود تا مجوزی چیز دیگری بگوید.
- viewای که نتواند بگوید از کدام policy بپرسد، موقع بالا آمدن پروژه رد میشود، نه روزی که کسی آن را پیدا کند.
پس فراموش کردن چیزی باعث میشود بیش از اندازه رد شود - که فوراً دیده میشود - نه اینکه بیش از اندازه نشان داده شود، که هیچ کس آن را نمیبیند.
همهی درها از همان قانونها میپرسند¶
| در | چه میکند |
|---|---|
| viewهای Django | ScopedQuerySetMixin، PolicyRequiredMixin، ProtectedFieldsViewMixin |
| Django REST framework | ScopedModelViewSet، یا هر بخش به تنهایی روی هر view |
| پنل ادمین | همهی صفحههای همهی مدلها، بدون هیچ کدی در ModelAdmin |
| کد خود شما | Order.objects.visible_to(user)، policy.allows(user, 'edit', order) |
چه چیزی لازم دارد¶
پایتون ۳.۱۱ تا ۳.۱۴؛ Django ۵.۲، ۶.۰ و ۶.۱؛ Django REST framework نسخهی ۳.۱۶ و بعد از آن، اختیاری؛ هر پایگاه دادهای که Django پشتیبانی میکند. صفحهها، پیامها و اسم مجوزها به انگلیسی و فارسی هستند.