حسین غلامیان
حسین غلامیان
خواندن ۲ دقیقه·۳ سال پیش

تعیین دسترسی در لاراول Authorization


در ابتدا باید با مفهوم تعیین دسترسی اشنا شویم تعیین دسترسی یا Authorization با Athentication تفاوت دارد Athentication بررسی میکند که آیا کاربر لاگین کرده است یا نه در واقع احراز هویت برای عملیات لاگین به کار میرود اما Authorization یا تعیین دسترسی بررسی میکند این کاربری که لاگین کرده اجازه چه عملیات هایی را دارد یا ندارد برای مثال هر کاربر میتواند فقط پستی را که خودش نوشته ویرایش کند درواقع نمی تواند پست دیگران را ویرایش کند به این عمل تعیین دسترسی میگویند

برای پیاده سازی این کار در لاراول میتوانیم از دو روش مبنای closure یا class استفاده کنیم که در ابتدا روش اول را بررسی میکنیم

برای این کار وارد پوشه ی App/providers/AuthServiceProvider شده و در متد boot دستور زیر را مینویسیم

public function boot() { $this->registerPolicies(); Gate::define('update-post', function (User $user, Post $post) { return $user->id === $post->user_id; }); }

همونطور که میبینید برای انجام این کار از فساد Gate استفاده شده و برای تعیین یک دسترسی متد define را صدا میزنیم که ارگومان اول یک نام برای دسترسی ای که میخواهیم ایجاد کنیم هست و ارگومان دوم یک closure میباشد . در همه ی تعیین دسترسی ها باید ابجکتی از مدل user به closure پاس داده شود و ما در این جا ارگومان دوم را نیز که ابجکتی از مدل post میباشد که به صورت type hint نوشته شده است را پاس داده ایم و در ادامه بررسی کرده ایم که ایا پست را همین کاربر نوشته است یا نه

حال برای استفاده از این Gate باید وارد کنترلر مورد نظر شویم که در این مثالی که میخواهیم به کاربر اجازه ویرایش پست هایی را بدهیم که فقط خودش نوشته است بدیم ، وارد کنترلر PostController شده و متد update را به صورت زیر تکمیل میکنیم

public function update(Request $request, Post $post) { if (! Gate::allows('update-post', $post)) { abort(403); } // Update the post... }

همونطور که میبینید از متد allows برای مجوز دادن به کاربر استفاده کرده ایم که اگر کاربر اجازه ورود نداشت ارور 403 میدهد در غیر این صورت میتواند پست را ویرایش کند

یا اینکه میتوانیم کار های بالا را در یک خط به صورت زیر خلاصه کنیم :

Gate::authorize('update-post', $post);



در روش دوم ابتدا باید یک کلاس Policy بسازیم توجه کنید که نام دهی این کلاس باید به صورت زیر باشد

ClassNamePolicy

برای ساخت این کلاس دستور زیر را در ترمینال اجرا میکنیم

php artisan make:policy PostPolicy

این کلاس در پوشه ی App\Policies ساخته میشود وارد کلاس شده و آن را به صورت زیر تکمیل میکنیم

class PostPolicy { use HandlesAuthorization; public function update(User $user, Post $post) { return $user->id === $post->user_id; } }

حال برای استفاده از این policy وارد کنترل مورد نظر شده و متد update را به صورت زیر تکمیل میکنیم

class PostController extends Controller { public function update(Request $request, Post $post) { $this->authorize('update', $post); // Update the post... } }



نویسنده حسین غلامیان

لاراولAuthorization
شاید از این پست‌ها خوشتان بیاید