مطالب اخیر

Role and Permission
| Reza Atom | یکشنبه 09 خرداد ماه 1400

Role and Permission

هیچ عنوان درخوری نتونستم پیدا کنم برای این پست؛ پس تصمیم گرفتم انگلیسی رو بغل کنم. ببخشید! 😁.
فکر نکنم نیاز باشه زیاد درباره این پست حرف بزنم. فقط باید بگم یکی از اصلی‌ترین قسمت‌های سایت‌ها همین قسمت هست؛ چون مدیران نمی‌خوان که همه بتونند هرکاری که امکانش هست رو انجام بدند.

شاید این روشی که من امروز بهتون می‌خوام نشون بدم بهینه‌ترین روش نباشه اما یه راهی هست برای برطرف کردن نیازمون.

شروع کار

نیاز نیست که بگم اولین کار درست کردن یک پروژه لاراولی هست چون خودتون خوب می‌دونید.
قبل از هر چیزی نیاز داریم که توی جدول User یک تعداد تغییر انجام بدیم و بعد از اون یک جدول جدید درست کنیم به اسم Role که اصلی‌ترین قسمت این آموزش رو این جدول قراره انجام بده.

User Table :

Php artisan make:migration "add role_id to users"
Schema::table('users', function (Blueprint $table) {  
   $table->unsignedBigInteger("role_id")->after("id");  
});

Role Table :

php artisan make:model Role -m
Schema::create('roles', function (Blueprint $table) {  
    $table->id();  
    $table->string("name");  
    $table->longText("scope");  
    $table->softDeletes();  
    $table->timestamps();  
});

با کد بالا هم Model رو ساختیم هم Migration رو.
دوست داشتید می‌تونید Seeder هم بسازید که کارتون برای اولش ساده‌تر بشه.

 پیاده‌سازی

بعد از مراحل بالا، ساخت Middleware برای بررسی درخواست‌ها هست.

php artisan make:middleware RoleManager
public function handle(Request $request, Closure $next, string $scope = ''){  
    $scopes = json_decode(Auth::user()->role->scope);  
    if (!in_array($scope, $scopes))  
        abort(403);  
    return $next($request);  
}

کد بالا از شما یه مجوز می‌گیره و بعد از کاربر می‌خواد مجوزهایی که داره رو بده بهش. چک می‌کنه ببینه مجوزی که ما دادیم رو کاربر داره یا نه!

یادتون نره که Middleware رو داخل فایل app/Http/Kernel.php اضافه کنید.

protected $routeMiddleware = [  
    .  
    .  
    .  
    'role' => RoleManager::class,  
];

طرز استفاده هم به این صورته:

Route::get("routename",[Controller:class,"functionName"])->name("route.name")->middleware("role:permission_name);

کد بالا هم که پر واضح هست پس نیازی به توضیح نداره.
این قسمت تقریباً اضافه‌کاری هست با این حال خیلی کمک می‌کنه توی پروژه.
به Model یوزر یک تابع اضافه می‌کنیم که دقیقاً مثل Middleware بالا هست کارش.

public function may($scope){  
    $scopes = json_decode($this->role->scope);  
    if (in_array($scope, $scopes))  
        return true;  
    return false;  
}

با این کد دیگه نیاز نیست هردفعه که خواستید کاربر رو بررسی کنید هی کد بالا رو بنویسید.
یادتون نره بین جدول User , Role رابطه برقرار کنید.

public function role(): BelongsTo{  
    return $this->belongsTo(Role::class);  
}

 پایان

دیگه تموم شد فکر نکنم زیاد سخت بوده باشه با این روش می‌تونید Routeهای پروژه رو فیلتر کنید.
اگر خواستید قسمتی از سایت رو برای کاربران نمایش ندید بر اساس این Permissionها می‌تونید توی Blade خودتون به این صورت عمل کنید:

@if ( Auth::user()->may("permission_name") )  
    //some html or blade code  
@endif

یا اگر بخواید دیگه خیلی کارخودتون رو ساده کنید توی یکی از Providerهای پروژه خودتون کد زیر رو اضافه کنید.
پشنهاد من فایل app/Providers/AppServiceProvider.php هست.

Blade::if('may', function ($scope) {  
    return Auth::user()->may($scope);  
});

حالا با کمک این کد دیگه نیاز نیست از اون @if بالا استفاده کنید و فقط کافیه بنویسید:

@may ("permission_name")  
    //some html or blade code  
@endmay

امیدوارم از این مقاله خوشتون آمده باشده و کارتون رو ساده کرده باشه.



مشترک خبرنامه ما شوید.