پرش به محتویات

یک پرسش چطور جواب داده می‌شود

هر در - یک view در Django، یک view در DRF، پنل ادمین، کد خود پروژه - همان پرسش را می‌پرسد، و جواب همیشه همان‌طور داده می‌شود:

order_access.policy.allows(user, 'edit', order)

۱. کدام policy

policy مدل - آنی که برایش ثبت شده، یا ModelPolicy، که مجوز و دامنه را می‌پرسد و نه بیشتر. view آن را از queryset خودش پیدا می‌کند؛ viewای بدون مدل نامش را می‌برد.

۲. کدام hook

درباره‌ی edit، can_edit تصمیم می‌گیرد - یا hookای که custom_actions آن را به آن وصل کرده. اکشنی که hook خودش را ندارد - approve، print_invoice - با مجوزش در دامنه‌اش تصمیم گرفته می‌شود، همان‌طور که چهار اکشن استاندارد.

۳. مجوز

hook مجوزی را می‌خواهد که permission_for نام می‌برد - shop.order_edit، یا shop.change_order برای مدلی که مجوزهای Django را نگه داشته - از راه has_perm خود Django، پس backend جواب می‌دهد. ClearanceBackend این‌طور جواب می‌دهد:

  • آنچه مستقیم به شخص داده شده، و آنچه بسته‌هایش می‌دهند - بسته‌هایی که به او داده شده، و بسته‌هایی که از راه نقشش با آن‌ها شروع می‌کند؛
  • منهای آنچه از او گرفته شده؛
  • در سقف نقش او.

کسی که وارد نشده، یا حسابش غیرفعال است، هر backendی که نصب باشد، هیچ چیزی ندارد.

۴. دامنه

داشتن order_edit هنوز داشتن آن برای این سفارش نیست. مجوزهایی از این نوع که به شخص می‌رسند - هر کدام با دامنه‌اش - در یک فیلتر کنار هم گذاشته می‌شوند: «شعبه‌شان» یا «مال خودشان» یا یک قانون. سفارش باید میان ردیف‌هایی باشد که این فیلتر می‌گذارد. مجوزی با all همه‌ی ردیف‌ها را می‌گذارد؛ مجوزی بدون دامنه به پیش‌فرض مدل می‌رسد - هیچ ردیفی، مگر مدل چیز دیگری بگوید.

۵. قانون خود policy

در آخر، آنچه hook اضافه می‌کند: «هیچ‌وقت سفارش تحویل‌شده»، «هیچ‌وقت وام خودت». محدود می‌کند، هیچ‌وقت وسیع‌تر نمی‌کند - hook از مجوز و دامنه شروع می‌کند، و چیزی را که آن‌ها اجازه می‌دهند رد می‌کند.

۶. حساب‌ها

هر چه hook بگوید، یک حساب فقط به دست کسی تغییر می‌کند یا حذف می‌شود که دست‌کم هر چه آن حساب دارد را داشته باشد: گذاشتن رمز عبور کسی یعنی ورود با حساب او.

همین، برای یک فهرست

یک فهرست همین را یک بار می‌پرسد، نه ردیف به ردیف: visible_to(user, 'edit') همان فیلتر قدم ۴ است، روی queryset - یک کوئری. ردیفی که قانون خود policy ردش می‌کند، وقتی باز یا نوشته شود رد می‌شود.

و برای یک فیلد، و یک مقدار

یک فیلد با مجوز دیدنش خوانده و با مجوز ویرایشش نوشته می‌شود، که در هر درخواست یک بار پرسیده می‌شود. یک مقدار وضعیت را کسی می‌نویسد که اکشنِ ادعاکننده‌ی آن را دارد - که با خود ردیف از policy پرسیده می‌شود، پس قدم ۵ برای آن هم برقرار است.