در ابتدا باید با مفهوم تعیین دسترسی اشنا شویم تعیین دسترسی یا 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... } }
نویسنده حسین غلامیان