یه برنامه نویس معمولی لینوکس کار
طراحی سطوح دسترسی در لاراول

برای دوستان سوال بود که چجوری میشه سطوح دسترسی برای لاراول ایجاد کرد . خوب برخی آموزش های ایرانی هستند که با هزینه زیاد ، هیچی یاد نمیدن. خوب این هم یک مدلشه دیگه . کسی که همه چیز رو میگه کامل بلدم و یادتون میدم ، یه جای کارش میلنگه . بگذریم ...
به نظر من نوشتن هر چیزی ، بهترین کار نیست . لاراول برای راحتی برنامه نویسا اومده (Love beautiful code? We do too.)
خوب . اول از همه باید بریم به پکیج هیجان انگیز spatie/laravel-permission . لینک زیر کاملا همه چیز رو گفته :
خوب حالا نوبت نصب پکیجه . دستور زیر رو توی ترمینال بزنین :
composer require spatie/laravel-permissionبه فایل config/app.php برید و داخل providers کد زیر رو قرار بدید :
'providers' => [
// ...
Spatie\Permission\PermissionServiceProvider::class,
];حالا migration رو میتونیم منتشر کنیم :
$ php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
$ php artisan migrate
$ php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"حالا به config/permissions.php برید. داخل این فایل میتونین کاملا هر تنظیماتی که میخواید رو اعمال کنین . تا اینجای کار که چیز خاصی نبود . یک نصب کردن معمولی بود . اما داستان اونجایی شروع میشه که ما میخوایم پنل مدیریت و یا حتی بخش کاربری رو برای سطوح دسترسی مدیریت کنیم .
من یک مثال طراحی میکنم ، بعدش میریم که امکانات دسترسی رو روی اون مثال پیاده کنیم .
فرض کنیم که ما یک پنل داریم که دو بخش داره . بخش مدیریت کاربران و بخش ایجاد پست .
من میخوام که این دو بخش برای مدیر باز باشه . اما بخش مدیریت کاربران برای کاربر با سطح دسترسی manager فقط قابل رویت باشه ، برای کاربر با سطح دسترسی author کلا قابل رویت نباشه .
و اینکه کاربر با دسترسی manager بتونه پست ها رو بخونه ، اما کاربر با دسترسی author بتونه یک پست هم ارسال کنه .
پس ما دو گروه داریم .
گروه author و گروه manager .
گروه author میتونه پست ایجاد کنه و پست ها رو ببینه .
گروه manager میتونه پست ها را بخونه و کاربران را هم بخونه . ( عملیات ویرایش ندارد )
خوب . اول از همه ما یک model داریم . به اسم users که خود لاراول ایجاد کرده . مدل رو به این شکل تغییر بدید .
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use HasRoles;
// ...
}قسمت HasRoles رو دقت کنید .
اول از همه باید یک کنترلر بسازیم ( به هر شکل و شمایلی که دوست دارید ) که بتونه جداول permissions رو پر کنه تا از روی اونا تصمیم گیری انجام بشه .
یک کنترلر بسازید و کلاس های مربوط رو بالا use کنید و با متودهایی که داریم ، گروه های کاربری رو بسازیم .
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
.......
$authorRole=Role::create(['name' => 'author']);
$authorPerms=Permission::create(['name' => 'edit posts','name' => 'view posts']);
$managerRole=Role::create(['name' => 'manager']);
$managerPerms=Permission::create(['name' => 'view users','name' => 'manager view posts']);
//Assignee roles to perms
$authorRole->givePermissionTo($authorPerms);
$managerRole->givePermissionTo($managerPerms);
.......خوب از کدا معلومه داریم چی کار میکنیم . حالا بریم داخل blade . دوتا منو داریم که یکی ما رو میبره به صفحه کاربران و یکی هم میبره به صفحه پست ها .
<a href="{{route('users')}}> All users </a>
<a href="{{route('posts')}}> All posts </a>سناریو رو حالا پیاده میکنیم .
پکیج spatie برای blade یکم سری سینتکس نوشته که خیلی عالی و تمیزه . ازشون استفاده میکنیم :
@role('manager')
<a href="{{route('users')}}> All users </a>
@endrole
@hasanyrole('manager|author')
<a href="{{route('posts')}}> All posts </a>
@endhasanyroleداخل این قسمت گفتیم اگر role برابر بود با manager بتونه کاربران رو ببینه ( لینک مربوط به کاربران رو ) و اگر کاربر یکی از سطوح manager و یا author بود هم بتونه لینک پست ها رو ببینه .
دقت کنید که اینجا ما روی متود های کنترلر posts و یا users شرط نزاشتیم . کاربر اگر به صورت مستقیم و دستی داخل آدرس بار ، آدرس مورد نظر رو بنویسه میتونه وارد اون لینک خاص بشه . پس باید متود های مربوط به این آدرس ها رو هم ببندیم . برای این هم spatie تابع های خوبی داره .
public function index(){
$user=Auth::user();
if($user->hasRole('manager'){
//return view for users list
}
else{
//show user 403 permission denied
}
}این متود برای manager بود . همین کار رو میتونین برای پست ها و حتی هر دکمه و هر عملیات دیگه هم انجام بدید .
من چون قصدم آموزش دادن نیست و فقط در حد راهنمایی ( در حد سوادم ) میخواستم بنویسم ، در همین حد بسنده میکنم و توصیه میکنم که داکیومنت spatie/permissions رو کامل مطالعه کنین . نحوه نوشتن رو گفتم . باز اگر سوالی بود ، کامنت کنین در خدمتم .
مطلبی دیگر از این انتشارات
تفاوت متد report و render در اکسپشنهای لاراول
مطلبی دیگر از این انتشارات
بخشی از سیستم تست در لاراول به صورت ساده
مطلبی دیگر از این انتشارات
دسته بندی زبانها بر اساس قوانین جمع بستن: درسی از لاراول و زند